我不得不导出70多个相同报告的不同数据子集。它们都具有相同的文件名,例如“ Campus X Item Analysis.csv”,其中X是每个校园的名称。
我需要创建一个数据框,其中列是每个文件的第8列,并以子集的名称来命名这些列。这将必须来自文件名,因为某种原因,该报告未在任何地方包括子集的名称。
这是我第一次问问题,在此先感谢,如果您需要了解其他信息,请告诉我。
我将具体说明自己的需求。
我有一个文件列表:
Campus 1 Item Analysis.csv
Campus 2 Item Analysis.csv
Campus 3 Item... and so on
每个文件具有相同格式的数据。
Campus 1 Item Analysis.csv:
1 2 3 4 5 6 7 8 9...
[A1] [B1] [C1] [D1] [E1] [F1] [G1] [H1] [I1]
[A2] [B2] [C2] [D2] [E2] [F2] [G2] [H2] [I2]
我希望将每个文件的第8列汇总到单个数据帧中,最好将其标记为园区。
Campus 1 Campus 2 Campus 3...
[H1] [H1] [H1]
[H2] [H2] [H2]
[H3... and so on
答案 0 :(得分:0)
在没有太多需要处理的信息的情况下,我建议使用list.files()
并对其进行遍历。
files <- list.files()
for(i in 1:length(files)){
f<-read.csv(files[i])
assign(files[i], f)}
tmp <- mget(ls())
dat <- c()
dat_name <- c()
for(i in 1:length(tmp)){
dat <- c(dat, tmp[[i]][,8])
dat_name <- c(dat_name, rep(names(tmp)[i], nrow(tmp[[i]])))
}
如果使用lapply
而不是我的循环,则可以加快速度,但是不确定我的解决方案是否正是您所追求的。它应该读入getwd()
中的所有文件,如果该目录中有您不需要的文件,请使用pattern
的{{1}}参数,与list.files
类似将所有对象分组到一个列表中。如果您的R环境中还有其他对象,请使用mget
中的pattern
参数。
读入文件循环应将数据帧重命名为文件名,我假设这些名称将被传递到tmp列表的名称。然后,我制作了两个向量(可以将其编译为df),一个向量包含所有文件的第8列中的数据,而另一个则包含它们来自的列表的名称,它们的长度应相等。如果希望将每个文件的第八列放在一个df的单独列中,这很容易,请在第二个循环中使用ls()
。
这显然未经测试,可能包含错误,请运行并让我知道。
答案 1 :(得分:0)
好的,我整天都在用头撞墙,弄清楚了。
fullnames<-list.files()
alldata<-lapply(fullnames,read.csv)
col8<-lapply(alldata,'[[',8)
final<-do.call(cbind,col8)
shortnames<-gsub(" Item Analysis.csv","",fullnames)
colnames(final)<-shortnames
write.csv(final,"Combined Data.csv")
我认为这真的很草率,但是最终我得到了所需的东西。
“短名称”列表只是我从文件名中删除后缀,使内容更整洁。