在几个csv文件中建立平均值

时间:2014-05-13 11:57:37

标签: r csv

我在Coursera上有一个作业而且我被卡住了 - 我不一定需要或想要一个完整的答案(因为这会作弊)但是正确方向的暗示将受到高度赞赏。

我在一个文件夹中有超过300个CSV文件(名为001.csv,002.csv等)。每个包含一个带标题的数据框。我正在编写一个函数,它将采用三个参数:文件的位置,要计算平均值的列的名称(在数据框内)和要在计算中使用的文件(id)

我试图让它尽可能简单:

pm <- function(directory, pollutant, id = 1:332) {

setwd("C:/Users/cw/Documents")
setwd(directory)

files <<- list.files()

首先,设置wd并获取所有文件的列表

x <- id[1] 
x

获取用户指定ID的起点。

问题

for (i in x:length(id)) {
df <- rep(NA, length(id))
df[i] <- lapply(files[i], read.csv, header=T)
result <- do.call(rbind, df)
return(df)
}
}

所以这就是我撞墙的地方:我需要从上面拿出用户指定的输入(例如10:25)并将文件中的内容放入&#34; 010.csv&#34;通过&#34; 025.csv&#34;进入一个数据框,实际上得出一个特定列的平均值。

所以我的想法是从id的长度(例如16到10:25)开始以指定id的起始点运行for循环。在此循环中,我需要将files的适当值作为read.csv的输入,并将.csv文件的内容放在数据帧中。

我可以获得单个.csv文件并将它们放入数据框中,但不是几个。

是否有人提示我如何处理?

3 个答案:

答案 0 :(得分:1)

根据您的示例,例如10个文件的16个文件,即010.csv,011.csv,012.csv等。 假设您的命名约定遵循目录中文件的顺序,您可以尝试:

csvFiles <- list.files(pattern="\\.csv")[10:15]#here [10:15] ... in production use your function parameter here 
file_list <- vector('list', length=length(csvFiles)) 
df_list <- lapply(X=csvFiles, read.csv, header=TRUE) 
names(df_list) <- csvFiles #OPTIONAL: if you want to rename (later rows) to the csv list
df <- do.call("rbind", df_list)
mean(df[ ,"columnName"])

这些代码片段应该可以设置为pimp并整合到您的例程中。

答案 1 :(得分:0)

您可以将csv文件聚合到一个大表中,如下所示:

for(i in 100:250)
{
    infile<-paste("C:/Users/cw/Documents/",i,".csv",sep="")
    newtable<-read.csv(infile)
    newtable<-cbind(newtable,rep(i,dim(newtable)[1])    # if you want to be able to identify tables after they are aggregated
    bigtable<-rbind(bigtable,newtable)
}

(您必须使用用户指定的输入替换100:250。)

然后,计算你想要的东西应该不是很难。

这对于文件001到099不起作用,你必须将它们与其他文件区分开来因为“0”,但它可以通过很少的处理来修复。

答案 2 :(得分:0)

为什么lapply循环中有for?只做lapply(files[files %in% paste0(id, ".csv")], read.csv, header=T)

他们还应该教你永远不要使用<<-