Добавление двух векторов по именам

У меня есть два названных вектора

v1 <- 1:4
v2 <- 3:5
names(v1) <- c("a", "b", "c", "d")
names(v2) <- c("c", "e", "d")

Я хочу добавить их по именам, т.е. Ожидаемый результат

> v3  
a b c d e   
1 2 6 9 4

Есть ли способ программно сделать это в R? Обратите внимание, что имена необязательно должны быть отсортированы в порядке, указанном выше в v2.

Ответ 1

Просто соедините векторы (например, с помощью c) и используйте tapply:

v3 <- c(v1, v2)
tapply(v3, names(v3), sum)
# a b c d e 
# 1 2 6 9 4 

Или, для удовольствия (поскольку вы просто делаете sum), продолжая "v3":

xtabs(v3 ~ names(v3))
# names(v3)
# a b c d e 
# 1 2 6 9 4

Я полагаю, что с "data.table" вы также можете сделать что-то вроде:

library(data.table)
as.data.table(Reduce(c, mget(ls(pattern = "v\\d"))), 
              keep.rownames = TRUE)[, list(V2 = sum(V2)), by = V1]
#    V1 V2
# 1:  a  1
# 2:  b  2
# 3:  c  6
# 4:  d  9
# 5:  e  4

(Я разделил последнее не столько на "data.table", сколько на автоматизированный способ захвата интересующих векторов).