我正试图在三个有名称的向量中找到共同的名称。我想找出这三个向量中的共同名称,并计算(或求和(这些共同命名向量的值。
例如:
vec1<- c(1:20)
names(vec1) = c( "X13" , "X25", "X58", "X79", "X95" , "X118", "X212", "X311",
"X422" , "X536", "X899", "X1005","X1080" , "X1118", "X1322", "X1516","X1705"
, "X1890", "X1925", "X2008")
vec2<- c(21:40)
names(vec2) = c( "X11" , "X25", "X58", "X79", "X119" , "X120", "X212", "X311",
"X422" , "X536", "X899", "X995","X1080" , "X1098", "X1322", "X1516","X1705"
, "X1890", "X1930", "X2008")
vec3<- c(41:60)
names(vec3) = c( "X13" , "X25", "X58", "X79", "X95" , "X118", "X212", "X311",
"X422" , "X536", "X899", "X1005","X1080" , "X1118", "X1322", "X1516","X1705"
, "X1890", "X1925", "X2010")
在上面的示例中,在vec1、vec2和vec3中,"x25"是值为2,22和42的通用名称。因此,输出应该具有x25,其值为66(2+22+42=66(。
此外,"x13"存在于vec1和vec3中,但不存在于vec2中。所以应该忽略它。
我试过使用is.equal,但是我遇到了错误。
我们可以使用Reduce
和intersect
来找出所有向量之间的通用名称,然后将这些名称从所有向量中子集并相加。
common_names <- Reduce(intersect, list(names(vec1), names(vec2), names(vec3)))
vec1[common_names] + vec2[common_names] + vec3[common_names]
# X25 X58 X79 X212 X311 X422 X536 X899 X1080 X1322 X1516 X1705 X1890
# 66 69 72 81 84 87 90 93 99 105 108 111 114
这里有一个tidyverse
选项
library(tidyverse)
list(vec1, vec2, vec3) %>%
map_df(enframe, .id = 'vec') %>%
group_by(name) %>%
filter(n_distinct(vec) == 3) %>%
summarise(value = sum(value))