打开文件夹中的所有文件并应用功能

我正在做一个相对简单的分析,我把它放到一个函数中,放在特定文件夹中的所有文件中。 我想知道是否有人有任何提示可以帮助我在多个不同文件夹上自动执行该过程。

  • 首先,我想知道是否有一种方法可以将特定文件夹中的所有文件直接读入R.我相信以下命令将列出所有文件:
  • files <- (Sys.glob("*.csv"))

    ...我从使用R找到具有指定扩展名的所有文件

    然后下面的代码将所有这些文件读入R.

    listOfFiles <- lapply(files, function(x) read.table(x, header = FALSE)) 
    

    ...从R操纵多个文件

    但是这些文件似乎被作为一个连续列表读入,而不是单个文件......我如何更改脚本以打开特定文件夹中的所有csv文件作为单独的数据帧?

  • 其次,假设我可以单独读取所有文件,那么如何一次完成所有这些数据帧的功能。 例如,我创建了四个小数据框,以便说明我想要的内容:

    Df.1 <- data.frame(A = c(5,4,7,6,8,4),B = (c(1,5,2,4,9,1)))
    Df.2 <- data.frame(A = c(1:6),B = (c(2,3,4,5,1,1)))
    Df.3 <- data.frame(A = c(4,6,8,0,1,11),B = (c(7,6,5,9,1,15)))
    Df.4 <- data.frame(A = c(4,2,6,8,1,0),B = (c(3,1,9,11,2,16)))
    
  • 我也做了一个示例函数:

    Summary<-function(dfile){
    SumA<-sum(dfile$A)
    MinA<-min(dfile$A)
    MeanA<-mean(dfile$A)
    MedianA<-median(dfile$A)
    MaxA<-max(dfile$A)
    
    sumB<-sum(dfile$B)
    MinB<-min(dfile$B)
    MeanB<-mean(dfile$B)
    MedianB<-median(dfile$B)
    MaxB<-max(dfile$B)
    
    Sum<-c(sumA,sumB)
    Min<-c(MinA,MinB)
    Mean<-c(MeanA,MeanB)
    Median<-c(MedianA,MedianB)
    Max<-c(MaxA,MaxB)
    rm(sumA,sumB,MinA,MinB,MeanA,MeanB,MedianA,MedianB,MaxA,MaxB)
    
    Label<-c("A","B")
    dfile_summary<-data.frame(Label,Sum,Min,Mean,Median,Max)
    return(dfile_summary)}
    

    我通常会使用以下命令将函数应用于每个单独的数据帧。

    Df1.summary <-Summary(dfile)

    有没有办法将函数应用于所有数据框,并在汇总表中使用数据框的标题(即Df1.summary)。

    非常感谢,

    凯蒂


    相反,我认为使用list可以很容易地自动化这些事情。

    这里有一个解决方案(我将你的四个数据框存储在文件夹temp/ )。

    filenames <- list.files("temp", pattern="*.csv", full.names=TRUE)
    ldf <- lapply(filenames, read.csv)
    res <- lapply(ldf, summary)
    names(res) <- substr(filenames, 6, 30)
    

    为文件存储完整路径非常重要(正如我对full.names所做的full.names ),否则必须粘贴工作目录,例如

    filenames <- list.files("temp", pattern="*.csv")
    paste("temp", filenames, sep="/")
    

    也会起作用。 请注意,我使用substr来提取文件名,同时丢弃完整路径。

    您可以按如下方式访问您的汇总表:

    > res$`df4.csv`
           A              B        
     Min.   :0.00   Min.   : 1.00  
     1st Qu.:1.25   1st Qu.: 2.25  
     Median :3.00   Median : 6.00  
     Mean   :3.50   Mean   : 7.00  
     3rd Qu.:5.50   3rd Qu.:10.50  
     Max.   :8.00   Max.   :16.00  
    

    如果你真的想得到个人汇总表,你可以在之后提取它们。 例如,

    for (i in 1:length(res))
      assign(paste(paste("df", i, sep=""), "summary", sep="."), res[[i]])
    

    通常我不会在R中使用循环,但这里是我使用for循环和两个软件包的解决方案: plyrdostats

    plyr正在运行,你可以在https://github.com/halpo/dostats上下载dostats (可以使用hadley devtools包中的install_github)

    假设我在csv文件中有你的前两个data.frame(Df.1和Df.2),你可以做这样的事情。

    require(plyr)
    require(dostats)
    
    files <- list.files(pattern = ".csv")
    
    
    for (i in seq_along(files)) {
    
        assign(paste("Df", i, sep = "."), read.csv(files[i]))
    
        assign(paste(paste("Df", i, sep = ""), "summary", sep = "."), 
               ldply(get(paste("Df", i, sep = ".")), dostats, sum, min, mean, median, max))
    
    }
    

    这是输出

    R> Df1.summary
      .id sum min   mean median max
    1   A  34   4 5.6667    5.5   8
    2   B  22   1 3.6667    3.0   9
    R> Df2.summary
      .id sum min   mean median max
    1   A  21   1 3.5000    3.5   6
    2   B  16   1 2.6667    2.5   5
    
    链接地址: http://www.djcxy.com/p/38369.html

    上一篇: Opening all files in a folder, and applying a function

    下一篇: How to lock designable size of custom UView