如何合并 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
作为分组变量 . ~ spp
和 sum
作为汇总的函数汇总所有列中的数据
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
")
我正在尝试合并两个不同长度的列表,其中某些列被添加在一起并且没有重复项,我可以合并这两个列表,但它会为每个 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
作为分组变量. ~ spp
和sum
作为汇总的函数汇总所有列中的数据
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
")