在 R 中合并多个数据帧
Merging multiple dataframess in R
我有多个数据框需要合并的问题。我尝试了 rbind、cbind 和基本合并。但它并没有给我满意的结果。我的问题如下:
第一个 df:
Common, Col 2, Col 3
A, 2, 3
B, 3, 4
C, 4, 5
D, 5, 6
第二个 df:
Common, Col 3, Col 4
B, 4, 5
D, 6, 6
E, 3, 4
第三个 df:
Common, Col 1, Col 2
A, a, 2
C, f, 4
F, g, 1
我组合的时候,我要:
Common, Col 1, Col 2, Col 3, Col 4
A, a, 2, NA, NA
B, NA, 3, 4, 5
C, f, 4, 5, NA
D, NA, 5, 6, 6
E, NA, NA, 3, 4
F, g, 1, NA, NA
我当前将多个 df 组合在一起的代码使用:
df_list <- mget(ls(pattern="*df"))
New_df <- do.call(rbind.fill, df_list)
rbind.fill 方法效果不佳。它基本上不会按要求折叠行。
我尝试了下面 link 中的 multmerge()。但无法让它工作。
https://www.r-bloggers.com/merging-multiple-data-files-into-one-data-frame/
谢谢
一个不优雅的解决方案是:
A = data.frame(c1 = c(1, 2), c3 = c('yes', 'no'))
B = data.frame(c2 = c(1, 2), c4 = c('Tokyo', 'Berlin'))
A1 = cbind(A, c2 = rep(NA, 2), c4 = rep(NA, 2))
B1 = cbind(B, c1 = rep(NA, 2), c3 = rep(NA, 2))
rbind(A1, B1)
产生
c1 c3 c2 c4
1 1 yes NA <NA>
2 2 no NA <NA>
3 NA <NA> 1 Tokyo
4 NA <NA> 2 Berlin
因为你要匹配列,这是一个连接操作,rbind
不会做,你需要merge
;而merge
默认设置by = intersect(names(x), names(y))
,即公共列,所以你可以使用Reduce()
函数将数据帧一一合并,假设它们已经被收集到一个列表中:
Reduce(function(x,y) merge(x, y, all=T), df_list)
# Common Col.2 Col.3 Col.4 Col.1
#1 A 2 3 <NA> a
#2 B 3 4 5 <NA>
#3 C 4 5 <NA> f
#4 D 5 6 6 <NA>
#5 E <NA> 3 4 <NA>
#6 F 1 <NA> <NA> g
我有多个数据框需要合并的问题。我尝试了 rbind、cbind 和基本合并。但它并没有给我满意的结果。我的问题如下:
第一个 df:
Common, Col 2, Col 3
A, 2, 3
B, 3, 4
C, 4, 5
D, 5, 6
第二个 df:
Common, Col 3, Col 4
B, 4, 5
D, 6, 6
E, 3, 4
第三个 df:
Common, Col 1, Col 2
A, a, 2
C, f, 4
F, g, 1
我组合的时候,我要:
Common, Col 1, Col 2, Col 3, Col 4
A, a, 2, NA, NA
B, NA, 3, 4, 5
C, f, 4, 5, NA
D, NA, 5, 6, 6
E, NA, NA, 3, 4
F, g, 1, NA, NA
我当前将多个 df 组合在一起的代码使用:
df_list <- mget(ls(pattern="*df"))
New_df <- do.call(rbind.fill, df_list)
rbind.fill 方法效果不佳。它基本上不会按要求折叠行。
我尝试了下面 link 中的 multmerge()。但无法让它工作。 https://www.r-bloggers.com/merging-multiple-data-files-into-one-data-frame/
谢谢
一个不优雅的解决方案是:
A = data.frame(c1 = c(1, 2), c3 = c('yes', 'no'))
B = data.frame(c2 = c(1, 2), c4 = c('Tokyo', 'Berlin'))
A1 = cbind(A, c2 = rep(NA, 2), c4 = rep(NA, 2))
B1 = cbind(B, c1 = rep(NA, 2), c3 = rep(NA, 2))
rbind(A1, B1)
产生
c1 c3 c2 c4
1 1 yes NA <NA>
2 2 no NA <NA>
3 NA <NA> 1 Tokyo
4 NA <NA> 2 Berlin
因为你要匹配列,这是一个连接操作,rbind
不会做,你需要merge
;而merge
默认设置by = intersect(names(x), names(y))
,即公共列,所以你可以使用Reduce()
函数将数据帧一一合并,假设它们已经被收集到一个列表中:
Reduce(function(x,y) merge(x, y, all=T), df_list)
# Common Col.2 Col.3 Col.4 Col.1
#1 A 2 3 <NA> a
#2 B 3 4 5 <NA>
#3 C 4 5 <NA> f
#4 D 5 6 6 <NA>
#5 E <NA> 3 4 <NA>
#6 F 1 <NA> <NA> g