打开文件夹中的所有文件,并应用一个函数

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

  1. 首先,我想知道是否有一种方式直接读入特定文件夹中的所有文件。我相信下面的命令将列出所有的文件:

files <- (Sys.glob("*.csv"))

…我从使用Rfind具有指定扩展名的所有文件

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

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

从操纵R中的多个文件

但是这些文件似乎是作为一个连续的列表读入的,而不是单独的文件…我怎样才能改变脚本来打开特定文件夹中的所有csv文件作为单独的数据框?

  1. 其次,假设我可以单独读取所有的文件,那么我怎么一次完成所有这些dataframe的function。 例如,我创build了四个小数据框,以便说明我想要的内容:

     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))) 

我也做了一个例子function:

 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可以很容易地自动化这些事情。

这里是一个解决scheme(我将你的四个数据框存储在文件夹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) 

保存文件的完整path非常重要(就像我用full.names做的full.names ),否则你必须粘贴工作目录,例如

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

也会工作。 请注意,我使用substr提取文件名,同时丢弃完整path。

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

 > res$`df4.csv` AB 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,但这里是我的解决scheme使用for循环和两个包: plyrdostats

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

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

 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