如何合并 R 中的列表并将某些重复的列添加到一起?

How to merge lists in R and add certain columns together where there are duplicates?

我正在尝试合并两个不同长度的列表,其中某些列被添加在一起并且没有重复项,我可以合并这两个列表,但它会为每个 header 创建两个不同的列。示例: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、nnative、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
")