R:在单独文件中创建由现有列组成的数据框

时间:2019-01-31 22:13:34

标签: r

我不得不导出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

2 个答案:

答案 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")

我认为这真的很草率,但是最终我得到了所需的东西。
“短名称”列表只是我从文件名中删除后缀,使内容更整洁。