我需要按行合并数据集,但它们具有不同的列.如何轻松地让R合并行,添加缺少的列并用NAs填充缺少的列?目前我会这样做(多次合并非常耗时):
创建假数据......
x1<-LETTERS[1:3]
x2<-letters[1:3]
x3<-rnorm(3)
x4<-rnorm(3)
x5<-rnorm(3)
Run Code Online (Sandbox Code Playgroud)
具有一些相似列的多个data.frames的示例,一些不同...
data.frame(x1,x2,x3,x4,x5)
data.frame(x1,x3,x4,x5)
data.frame(x2,x3,x4,x5)
data.frame(x1,x2,x3,x4,x5)
Run Code Online (Sandbox Code Playgroud)
我现在如何合并......
DF<-data.frame(rbind(data.frame(x1,x2,x3,x4,x5),
data.frame(x1,x2,x3,x4,x5),
data.frame("x2"=rep(NA,3),data.frame(x1,x3,x4,x5)),
data.frame("x1"=rep(NA,3),data.frame(x2,x3,x4,x5))))
DF
Run Code Online (Sandbox Code Playgroud)
编辑:我尝试了如下建议的代码:
l <- list(data.frame(x1,x2,x3,x4,x5),
data.frame(x1,x3,x4,x5),
data.frame(x2,x3,x4,x5),
data.frame(x1,x2,x3,x4,x5))
merger <- function(l) lapply(2:length(l), function(x) merge(l[[x-1]], l[[x]], all=TRUE))
while (length(l) != 1) l<-merger(l)
l
Run Code Online (Sandbox Code Playgroud)
产量:
[[1]]
x1 x3 x4 x5 x2
1 A 0.25492 0.30160 0.259287 a
2 B -0.25937 0.45936 -0.075415 b
3 C -0.53493 1.18316 0.627335 c
Run Code Online (Sandbox Code Playgroud)
不:
> DF
x1 x2 x3 x4 x5
1 A a 0.25492 0.30160 0.259287
2 B b -0.25937 0.45936 -0.075415
3 C c -0.53493 1.18316 0.627335
4 A a 0.25492 0.30160 0.259287
5 B b -0.25937 0.45936 -0.075415
6 C c -0.53493 1.18316 0.627335
7 A <NA> 0.25492 0.30160 0.259287
8 B <NA> -0.25937 0.45936 -0.075415
9 C <NA> -0.53493 1.18316 0.627335
10 <NA> a 0.25492 0.30160 0.259287
11 <NA> b -0.25937 0.45936 -0.075415
12 <NA> c -0.53493 1.18316 0.627335
Run Code Online (Sandbox Code Playgroud)
编辑2:很抱歉延长我原来的帖子,但我的低级代表不允许我回答我自己的问题.
结合Jaron和daroczig的反应可以得到我想要的结果.我不想将每个数据框分配给一个对象,因此将它们组合为一个列表然后使用rbind fill非常合适(参见下面的代码)
谢谢你们俩!
x1<-LETTERS[1:3]
x2<-letters[1:3]
x3<-rnorm(3)
x4<-rnorm(3)
x5<-rnorm(3)
DFlist<-list(data.frame(x1,x2,x3,x4,x5),
data.frame(x1,x3,x4,x5),
data.frame(x2,x3,x4,x5),
data.frame(x1,x2,x3,x4,x5))
rbind.fill(DFlist)
Run Code Online (Sandbox Code Playgroud)
jor*_*ran 14
我不得不读你的问题之前好几次我明白你要找的,但也许你想rbind.fill
从plyr
:
d1 <- data.frame(x1,x2,x3,x4,x5)
d2 <- data.frame(x1,x3,x4,x5)
d3 <- data.frame(x2,x3,x4,x5)
d4 <- data.frame(x1,x2,x3,x4,x5)
> rbind.fill(d1,d4,d2,d3)
x1 x2 x3 x4 x5
1 A a 1.1216923 0.9236393 0.2749292
2 B b 1.1913278 1.1145664 -0.5070576
3 C c 0.2837657 -0.6631544 -1.0675885
4 A a 1.1216923 0.9236393 0.2749292
5 B b 1.1913278 1.1145664 -0.5070576
6 C c 0.2837657 -0.6631544 -1.0675885
7 A <NA> 1.1216923 0.9236393 0.2749292
8 B <NA> 1.1913278 1.1145664 -0.5070576
9 C <NA> 0.2837657 -0.6631544 -1.0675885
10 <NA> a 1.1216923 0.9236393 0.2749292
11 <NA> b 1.1913278 1.1145664 -0.5070576
12 <NA> c 0.2837657 -0.6631544 -1.0675885
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3999 次 |
最近记录: |