我试图将两个不同长度的列表组合在一起,其中某些列被添加在一起,并且没有重复,我可以将两者合并,但它为每个标头创建两个不同的列。例如: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
作为分组变量. ~ 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
")