我在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文件并将它们放入数据框中,但不是几个。
是否有人提示我如何处理?
答案 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)
。
他们还应该教你永远不要使用<<-
。