如何合并R中的列表,并在有重复的地方将某些列添加到一起



我试图将两个不同长度的列表组合在一起,其中某些列被添加在一起,并且没有重复,我可以将两者合并,但它为每个标头创建两个不同的列。例如:per.cov变成per.cov.x和per.cov.y。我需要添加这两个列,而不是创建不同的列。以下是数据的缩短版本:

> MPS_T1
spp per.cov native nnative nn.state
1   ACMIO       2      2       0        0
2   BRCA5      22     22       0        0
3   CACA9       4      0       4        4
4   COPA3       2      0       2        0
> MPS_T2
spp per.cov native nnative nn.state
1        ACMIO       4      4       0        0
2        BRCA5       4      4       0        0
3        CACA9       2      0       2        2
4        CEAR4       2      2       0        0

这是我在当前输出中使用的代码

MPS <- merge(MPS_T1, MPS_T2, by = "spp", all = TRUE)

电流输出:

> MPS
spp per.cov.x native.x nnative.x nn.state.x per.cov.y native.y nnative.y
1        ACMIO         2        2         0          0         4        4         0
2        BRCA5        22       22         0          0         4        4         0
3        CACA9         4        0         4          4         2        0         2
4        CEAR4        NA       NA        NA         NA         2        2         0
5        COPA3         2        0         2          0        NA       NA        NA
nn.state.y
1           0
2           0
3           2
4           0
5           0
6          NA

所需输出:将具有相同名称(per.cov、native、nnive、nn.state(的列中的数值相加在一起。列"中的任何字符;spp";刚刚添加到列表中。请注意,CEAR4和COPA3不在这两个列表中,而是添加到底部,并且没有N/A。(我想N/A必须等于0才能起作用?(。

> MPS
spp per.cov   native   nnative   nn.state
1        ACMIO       6        6         0          0
3        BRCA5      26       26         0          0
4        CACA9       6        0         6          6
5        CEAR4       2        2         0          0
6        COPA3       2        0         2          0

我对此很陌生,找不到答案。

一个选项是使用aggregate

  • 使用rbind组合两个数据帧
  • 使用spp作为分组变量. ~ sppsum作为汇总函数,汇总所有列中的数据
aggregate(. ~ spp, rbind(MPS_T1, MPS_T2), sum)
#----
spp per.cov native nnative nn.state
1 ACMIO       6      6       0        0
2 BRCA5      26     26       0        0
3 CACA9       6      0       6        6
4 CEAR4       2      2       0        0
5 COPA3       2      0       2        0

dplyr等效

library(dplyr)
MPS_T1 %>%
bind_rows(MPS_T2) %>%
group_by(spp) %>%
summarize_all(sum)

数据

MPS_T1 <- read.table(text = "
spp per.cov native nnative nn.state
1   ACMIO       2      2       0        0
2   BRCA5      22     22       0        0
3   CACA9       4      0       4        4
4   COPA3       2      0       2        0
")          
MPS_T2 <- read.table(text = "
spp per.cov native nnative nn.state
1        ACMIO       4      4       0        0
2        BRCA5       4      4       0        0
3        CACA9       2      0       2        2
4        CEAR4       2      2       0        0
")