全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 R语言论坛
4073 14
2017-09-17
在我的工作目录里面有若干个csv文件:001.csv,002.csv,...,332.csv。
我需要写个代码:把输入的相应的文件序号的文件读入一个数据框文件。
下面是我的代码:

read.data <- function(x) {
  ## Define a function name read.data() to input all data.
  i.x <- 1:length(x)
       ## Use vector x 's index as loop number.

  for(i in i.x) {
    m.i <- formatC(x, flag = 0, width = 3)
          ## Change the i to a charactor with 3 digitals width,
          ## for example: 1 to "001"."
    d.m.i <- paste(m.i, "csv", sep = ".")
          ## Change the m.i to file name,
          ## for example:002 to 002.csv.
    pl.d.i <- read.table(d.m.i, header = TRUE, sep = ",")
    pl.data <<- rbind(pl.data, pl.d.i)
  }
}


这段代码定义了一个叫read.data的函数,当我运行这个函数的时候,比如read.data(1:3), 它应该把文件“001.csv","002.csv"和"003.csv"这几个文件中的数据依次合并到pl.data这个数据框中。
但是现在它最终只能把最后一个文件“在这个例子中是003.csv这个文件”读入到pl.data中。

哪位高手帮我看看到底出了什么问题?
非常谢谢!
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2017-9-17 20:35:43
受到这个帖子的启发,https://bbs.pinggu.org/thread-2799231-1-1.html。我把代码改成如下:

read.data <- function(x) {
    ## Define a function name read.data() to read all data.
    m.x <- formatC(x, flag = 0, width = 3)
      ## Change the i to a charactor with 3 digitals width,
      ## for example: 1 to "001"."
    d.m.x <- paste(m.x, "csv", sep = ".")
      ## Change the m.i to file name,
      ## for example:002 to 002.csv.
    dat1 <<- do.call(rbind,lapply(d.m.x,read.csv))
}  

完美解决我的问题,虽然其实还不知道最后一句的具体语法和意思,但是管用:)
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2017-9-17 20:43:59
如果哪位高手能够告诉我:如何利用循环语句,批量导入有规律名字的csv文件数据,将非常感激。
因为我现在还是不明白1楼的代码问题出在哪里,很苦恼。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2017-9-19 10:12:19
我终于找到了1楼中我代码的问题所在(红色字体部分是和一楼不同的地方),这就是新人的苦恼啊,基本概念不熟悉,更改代码如下就能成功实现: 输入任何1到999之间的数字向量,就能读取读取工作目录下相应文件(001.csv,002.csv,...,999.csv.)中的数据为数据框,并且最终合并成一个数据框文件:

read.data <- function(x) {
  ## Define a function name read.data() to read all data.
  i.x <- 1:length(x)   ## Use vector x's index as loop number.
pl.data <- data.frame()
    ## 定义一个空数据框,因为后面
    ## for循环中要用到这个变量
  for(i in i.x) {
    m.i <- formatC(x, flag = 0, width = 3)
        ## Change the i to a charactor with 3 digitals width,
        ## for example: 1 to "001"."
    d.m.i <- paste(m.i, "csv", sep = ".")
        ## Change the m.i to file name,
        ## for example:002 to 002.csv.
    pl.d.i <- read.table(d.m.i, header = TRUE, sep = ",",
                         stringsAsFactors = FALSE)
    pl.data <- rbind(pl.data, pl.d.i)
    ## 1楼代码主要出在这一句,用的是超级赋值<<-,这样pl.data就不存在for函数内,而存在于全球环境中了。
  }
  return(pl.data) ## 关键是这一句,不能在for函数内
}

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2017-9-19 10:35:30
复制代码
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2017-9-19 20:07:26
复制代码
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

点击查看更多内容…
相关推荐
栏目导航
热门文章
推荐文章

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群