如何在数据帧的指定部分上应用函数

时间:2014-11-10 15:21:25

标签: r dataframe

我对R来说是全新的,并且在在线R课程中遇到了一些问题。我有一个包含332个csv文件的文件夹,名为001-332。任务是编写一个函数,给出给定范围内每个文件的完整案例数和每个文件的id(即函数(目录,id),其中directory是包含文件的文件夹,id是a矢量指定要使用的文件)。输出应如下所示:https://d396qusza40orc.cloudfront.net/rprog%2Fdoc%2Fcomplete-demo.html

我设法创建了一个数据框,其中包含id参数指定的文件中的所有数据。

complete <- function(directory, id=1:332){
  files <- list.files(directory, full.names=T)
  dat <- data.frame()
  for(i in id){
    dat<-rbind(dat, read.csv(files[i]))
  }
}

在此之后,我尝试在sum(complete.cases(dat))上对dat数据集(当然在我的函数内部)中使用complete.cases函数,但这清楚地给出了整个&#34; dat&#的完整案例的总和。 34;数据帧。我的问题是,我应该分别得到每个id的完整案例总和。我现在使用许多子集解决方案进行了数小时的实验,但无法找到实现此目的的方法。任何帮助或建议将不胜感激!

1 个答案:

答案 0 :(得分:0)

在工作目录中创建几个文件后,

 list.files(pattern="^file\\d+")
 #[1] "file1.txt" "file2.txt"

 sapply(files, function(x) {x1 <- read.csv(x, header=TRUE, sep="")
                               sum(complete.cases(x1))})

 # file1.txt file2.txt 
 #  1          4

您也可以更改功能

 complete <- function(directory, id=1:2, pat='^file\\d+'){
    files <- list.files(directory, pattern=pat, full.names=TRUE)
    v1 <- vector("numeric", length(files))
    for(i in seq_along(id)){
    v1[i] <- sum(complete.cases(read.csv(files[i], sep='')))
      }
   data.frame(id=id, nobs=v1)
   }

  complete(directory, id=1:2)
  #  id nobs
  #1  1    1
  #2  2    4

更新

您还可以使该功能根据id

的特定模式读取文件
 complete <- function(directory, id=1:2){
   fileLook <- paste0("file", sprintf('%03d', id)) 
   Allfiles <- list.files(directory, full.names=TRUE)
   files <- grep(paste(fileLook, collapse="|"), Allfiles, value=TRUE)
   library(gtools)
   files <- mixedsort(files)  
   v1 <- vector("numeric", length(files))
     for(i in seq_along(id)){
       v1[i] <- sum(complete.cases(read.csv(files[i], sep='')))

        }
     data.frame(id=id, nobs=v1)
  }



 complete(directory, 1:2)
 #  id nobs
 #1  1    1
 #2  2    4
 complete(directory, c(1,3))
 #  id nobs
 #1  1    1
 #2  3    6