当ID列被隐含时,我该如何合并许多来自CSV文件的数据框?

20
我想要将多个数据框合并在一起(因为如果你只处理一个,很多操作似乎更容易,但如果我错了,请纠正我)。
当前我有一个像这样的数据框:
ID, var1, var2
A,  2,    2
B,  4,    5
.
.
Z,  3,    2

每个ID都在单独的一行上,带有多个单独的测量值。
我还有一个CSV文件,其中包含每个ID的重复测量值,例如:
文件名 = ID_B.csv
time, var4, var5
0,    1,    2
1,    4,    5
2,    1,    6
...

我想要的是:
ID, time, va1, var2, var4, var5
...
B,  0,    4,   5,    1,    2,
B,  1,    4,   5,    4,    5,
B,  2,    4,   5,    1,    6,
...

我并不太在意列的顺序。 我能想到的唯一解决方案是将ID列添加到每个CSV文件中,然后通过循环调用merge()几次来合并它们。 有没有更优雅的方法?

1个回答

16

据我理解,您需要从文件名中提取ID,然后将导入的CSV与现有数据框合并。

df1 <- read.csv(textConnection("ID, var1, var2
A,  2,    2
B,  4,    5"))

# assuming the imported csv-files are in working directory
filenames <- list.files(getwd(), pattern = "ID_[A-Z].csv")

# extract ID from filename
ids <- gsub("ID_([A-Z]).csv", "\\1", filenames)

# import csv-files and append ID
library(plyr)
import <- mdply(filenames, read.csv)
import$ID <- ids[import$Var1]
import$Var1 <- NULL

# merge imported csv-files and the existing dataframe
merge(df1, import)  

结果:

ID var1 var2 time var4 var5
1  B    4    5    0    1    2
2  B    4    5    1    4    5
3  B    4    5    2    1    6

哦!我完全忽略了每个CSV文件都是单个ID的测量数据。唉!你的答案非常好。 - JD Long
6
你只需要使用ldply而不是mdply,另外通过执行names(filenames) <- ids可以简化操作。在list.files中用.代替getwd()。除此之外,回答得很好。 - hadley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接