2014-11-18 32 views
11

mam dwa nazwane wektoryDodawanie dwa wektory o nazwach

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

Chcę dodać je według nazwy, czyli oczekiwany wynik jest

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

Czy istnieje sposób programowo to zrobić w R? Uwaga: nazwy niekoniecznie muszą być uporządkowane, jak na przykład powyżej.

+0

I chcesz wynik jako wektor? – A5C1D2H2I1M1N2O1R2T1

+0

Tak, najlepiej. Mogę żyć z alternatywami, ale wektor byłby najbardziej kompaktowy, jak sądzę. Rzeczywista para wektorów, z którą mam do czynienia, jest dość długa, więc chcę zminimalizować rozmiar. – Ricky

+1

FWIW, dla prostych sekwencji, '1: 4' i' 3: 5' wystarczy :-) –

Odpowiedz

14

Wystarczy połączyć wektory (używając c, na przykład) i używać tapply:

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

Lub dla zabawy (ponieważ jesteś po prostu robi sum), kontynuując "v3":

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

Przypuszczam, ze "data.table" można też zrobić coś takiego:

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 

(Podzieliłem ten ostatni nie tyle dla „data.table”, ale aby pokazać zautomatyzowany sposób przechwytywania wektory interesów.)

+0

Zawsze widzę, że ludzie, którzy rozumieją R, kodują w zupełnie inny sposób ... czasami nawet czują, że piszesz w innym języku :) (absolutnie komplement!) –

+1

@RichardScriven, w przeważającej części, 'tapply' jest koń pociągowy dla 'agregatu' (i' by'), więc od momentu, w którym wektory zostały połączone, istnieje kilka alternatyw. – A5C1D2H2I1M1N2O1R2T1

+0

Może to być późny komplement, ale to jest naprawdę piękne @AHandcartAndMohair! 'Xtabs' i' tapply' są bardzo przydatne, gdy próbują łączyć tabele częstotliwości, i są one dość niedostatecznie używane. – fhlgood