2014-11-18 19 views
11

Ho due denominati vettoriaggiungendo due vettori da nomi

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

voglio aggiungere in su con i nomi, vale a dire il risultato atteso è

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

C'è un modo per farlo a livello di codice questo in R? Nota che i nomi potrebbero non essere necessariamente in ordine, come in v2 sopra.

+0

e si desidera che il risultato sia un vettore? – A5C1D2H2I1M1N2O1R2T1

+0

Sì, preferibilmente. Posso vivere con alternative, ma il vettore sarebbe il più compatto che presumo. La coppia di vettori effettiva con cui ho a che fare è piuttosto lunga, quindi voglio ridurre al minimo le dimensioni. – Ricky

+1

FWIW, per le sequenze semplici, '1: 4' e' 3: 5' sono sufficienti :-) –

risposta

14

Basta unire i vettori (utilizzando c, per esempio) e utilizzare tapply:

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

Oppure, per divertimento (dal momento che si sta solo facendo sum), proseguendo con "v3":

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

suppongo con "data.table" si potrebbe anche fare qualcosa di simile:

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 

(ho condiviso quest'ultimo non tanto per "data.table" ma per mostrare un modo automatizzato di catturare i vettori di interesse.)

+0

Trovo sempre che le persone che capiscono R scrivano il codice in un modo completamente diverso ... a volte sembra addirittura di scrivere in una lingua diversa :) (assolutamente complimento!) –

+1

@RichardScriven, per la maggior parte, 'tapply' è il cavallo di battaglia per 'aggregare' (e' by') così dal punto in cui i vettori sono stati combinati, ci sono diverse alternative. – A5C1D2H2I1M1N2O1R2T1

+0

Questo potrebbe essere un complimento in ritardo, ma questo è davvero bello @AHandcartAndMohair! I 'xtabs' e' tapply' sono molto utili quando si tenta di combinare le tabelle di frequenza, e sono piuttosto poco usati. – fhlgood

Problemi correlati