【问题标题】:Dynamically creating data.frame with the variable which gets change in the for loop使用在 for 循环中发生变化的变量动态创建 data.frame
【发布时间】:2013-01-04 03:33:43
【问题描述】:

我有一个名为“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 的方法吗?

【问题讨论】:

  • 这是作业吗?它看起来很像彭在 Coursera 上的“数据分析”课程中的家庭作业。
  • @DWin 哈!你说得对。我知道这很熟悉。我昨天帮助了一位同事。
  • @DWin 是的。但我被困在某事上,因此只想知道如何让 data.frame 动态填充变量。所以问。我认为问题和答案也会对其他 R 用户有所帮助。此外,作业的截止日期已经过了,所以我没有用它来获得成绩。
  • 要形成由用零填充的数字序列构建的字符串,请使用 sprintf("%03d", 1:332)。这可以通过搜索 SO 找到。我想它就在上周再次得到了回答。
  • 是的@DWin。我认为你是对的,我们不需要 3 个场景。我们可以很容易地用 sprintf 做到这一点。谢谢你的建议。

标签: r dataframe


【解决方案1】:

构建所有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

【讨论】:

    猜你喜欢
    • 2014-05-20
    • 2019-06-14
    • 2015-12-26
    • 1970-01-01
    • 2023-04-01
    • 2015-09-10
    • 2017-12-11
    • 2018-02-18
    • 2012-01-21
    相关资源
    最近更新 更多