在R中基于行名称合并数据框

70

我如何合并两个数据框的列,这两个数据框包含不同的列名但是有些行名相同?那些在两个数据框中都不存在的行应该填充为零:

> d
    a   b   c   d   e   f   g   h   i  j
1 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0 10
2 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9  1
> e
   k  l  m  n  o  p  q  r  s  t
1 11 12 13 14 15 16 17 18 19 20
3 21 22 23 24 25 26 27 28 29 30
> de
    a   b   c   d   e   f   g   h   i  j  k  l  m  n  o  p  q  r  s  t
1 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0 10 11 12 13 14 15 16 17 18 19 20
2 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9  1  0  0  0  0  0  0  0  0  0  0
3 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0  0 21 22 23 24 25 26 27 28 29 30
2个回答

125

请查看?merge

名称为"row.names"或数字0会指定行名。

示例:

R> de <- merge(d, e, by=0, all=TRUE)  # merge by row names (by=0 or by="row.names")
R> de[is.na(de)] <- 0                 # replace NA values
R> de
  Row.names   a   b   c   d   e   f   g   h   i  j  k  l  m  n  o  p  q  r  s
1         1 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0 10 11 12 13 14 15 16 17 18 19
2         2 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9  1  0  0  0  0  0  0  0  0  0
3         3 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0  0 21 22 23 24 25 26 27 28 29
   t
1 20
2  0
3 30

1
做得好,谢谢。有没有更高效的方法?合并两个有20万行的列需要几分钟,即使是将一个空数据框与具有20万行和单列的数据框合并,也要花费几分钟... - barbaz
18
有没有办法保留行名并且不将它们移动到专用列中?当然,可以在之后执行rownames(de)=de$Row.names,只是想知道是否有方法在一开始就不破坏它。 - barbaz
不破坏它会是什么样子? - John
@John 喜欢 rownames(de)=de$Row.names; de=de[2:length(de)] - barbaz
3
使用merge是不可能做到的。请查看帮助文件:"列是共同的列,后面是x中剩余的列,然后是y中的列。" - rcs

0
这是我用来完成的方法:
library(dplyr)

full_join(d |> rownames_to_column("id"),
          e |> rownames_to_column("id"), by="id") |> 
          mutate(across(everything(), ~replace_na(., 0)))

输出:

  id   a   b   c   d   e   f   g   h   i  j  k  l  m  n  o  p  q  r  s  t
1  1 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0 10 11 12 13 14 15 16 17 18 19 20
2  2 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9  1  0  0  0  0  0  0  0  0  0  0
3  3 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0  0 21 22 23 24 25 26 27 28 29 30

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