使用在for循环中获得更改的变量动态创建data.frame

时间:2013-01-21 04:28:15

标签: r dataframe

我有一个名为“specdata”的目录,其中包含csv文件(例如001.csv,002.csv,...,332.csv)。现在我希望我的函数读取此目录中的所有文件并返回data.frame,其中第一列是文件的名称,第二列是完整案例的数量。

例如:

id nobs
1  108
2  345
...
etc

现在,我编写了这个函数来读取“specdata”目录中的所有文件,并在每个文件中生成完整案例的总和。但我不知道如何把每个没有。由“nobs”从循环生成到这种格式的新data.frame:

id  nobs
1   108
2   345
...
...
332 16

我的功能:

complete <- function(directory, id = 1:332) {

for(i in 1:332)
  {
    if(i<10)
      {

      path<-paste(directory,"/00",id[i],".csv",sep="")
      }
    if(i>9 & i<100)
      {

      path<-paste(directory,"/0",id[i],".csv",sep="") 
      }
    if(i>99 & i<333)
      {

      path<-paste(directory,"/",id[i],".csv",sep="") 
      }  

    mydata<-read.csv(path)
    #nobs<-nrow(na.omit(mydata))
    nobs<-sum(complete.cases(mydata))

  }


}

问题是“nobs”在for循环中逐行动态创建,我想将所有文件的整个“nobs”列表放入data.frame中。我尝试了很多方法,但无法将整个“nobs”列表与“id”数字一起放入data.frame。

有人可以建议一种按要求的顺序返回data.frame的方法吗?

1 个答案:

答案 0 :(得分:0)

建立所有nobs值列表的最简单方法是这样的:

complete <- function(directory, id = 1:332) {
  # Create an empty vector outside the for loop
  nobs_vector <- c()
  for(i in 1:332)
  {
    if(i<10)
    {
      path<-paste(directory,"/00",id[i],".csv",sep="")
    }
    if(i>9 & i<100)
    {
      path<-paste(directory,"/0",id[i],".csv",sep="") 
    }
    if(i>99 & i<333)
    {
      path<-paste(directory,"/",id[i],".csv",sep="") 
    }  

    mydata<-read.csv(path)
    #nobs<-nrow(na.omit(mydata))
    nobs<-sum(complete.cases(mydata))
    # Add the value to the end of the vector
    nobs_vector <- c(nobs_vector, nobs)
  }
  # Take a look at the final vector you end up with
  print(nobs_vector)
}

它不一定优雅或高效,但它确实以for循环完成后持续存在的形式获取这些值。如果您想以类似的方式构建数据框,请查看?rbind