用R中的for循环覆盖结果

用R中的for循环覆盖结果,r,R,我有许多csv文件,我的目标是找到id参数给定的一个文件或一组文件的完整案例数。我的函数应该返回一个数据框,其中列id指定文件,列obs给出该id的完整案例数。但是,我的函数覆盖每个循环中NOB的先前值,结果数据框只给出其最后一个值。您知道如何为每个id值获取nobs值吗 myfunction<-function(id=1:20) { files<-list.files(pattern="*.csv") myfiles = do.call(rbind, lapply(fi

我有许多csv文件,我的目标是找到id参数给定的一个文件或一组文件的完整案例数。我的函数应该返回一个数据框,其中列id指定文件,列obs给出该id的完整案例数。但是,我的函数覆盖每个循环中NOB的先前值,结果数据框只给出其最后一个值。您知道如何为每个id值获取nobs值吗

  myfunction<-function(id=1:20) {
  files<-list.files(pattern="*.csv")
  myfiles = do.call(rbind, lapply(files, function(x) read.csv(x,stringsAsFactors = FALSE)))  

   for (i in id) {  
   good<-complete.cases(myfiles)
   newframe<-myfiles[good,]
   cases<-newframe[newframe$ID %in% i,]
   nobs<-nrow(cases)  
  }
  clean<-data.frame(id,nobs)
  clean
 }

myfunction我们可以在
lappy()
内完成所有操作,如下所示(未测试):


myfunction我们可以在
lappy()
内完成所有操作,如下所示(未测试):


myfunction预期的输出是什么?另外,请阅读。我试图在我的帖子中更好地解释。我不知道
R
,但您需要将
nobs
添加到列表或类似的内容中,以便能够将该列表用作
data.frame
函数的参数。预期的输出是什么?另外,请阅读。我试图在我的帖子中更好地解释。我不知道
R
,但您需要将
nobs
添加到列表或类似内容中,能够将该列表用作
data.frame
函数的参数。该函数提供每个文件的完整案例,而不是函数参数id中指定的文件的完整案例。因此,id应该以某种方式合并到函数中。(id也是每个文件中的一列,因此id=1表示文件1等。)@Simonaleksandrovatanasova我们只需要对
文件
对象进行子集更新。然而,这再次给出了一个包含36行的数据帧,其中每个循环的结果重复6次(6个循环x 6个值)@Simonaleksandrovatanasova当您执行myfunction(id=1:2)
时会发生什么情况?不过我找到了解决方案,谢谢您的帮助!!我刚刚将初始化nobs作为一个向量,函数给出了每个文件的完整案例,而不是函数的参数id中指定的文件。因此,id应该以某种方式合并到函数中。(id也是每个文件中的一列,因此id=1表示文件1等。)@Simonaleksandrovatanasova我们只需要对
文件
对象进行子集更新。然而,这再次给出了一个包含36行的数据帧,其中每个循环的结果重复6次(6个循环x 6个值)@Simonaleksandrovatanasova当您执行myfunction(id=1:2)
时会发生什么情况?不过我找到了解决方案,谢谢您的帮助!!我只是把nobs初始化为一个向量。
myfunction <- function(id = 1:20) {
  files <- list.files(pattern = "*.csv")[id]

  do.call(rbind,
          lapply(files, function(x){
            df <- read.csv(x,stringsAsFactors = FALSE)
            df <- df[complete.cases(df), ]
            data.frame(ID=x,nobs=nrow(df))
            }
            )
          )  
}