2013-03-07 4 views
11

Esiste un modo semplice per eseguire un semplice calcolo in un elenco di elenchi?somma di due elenchi con elenchi in R

x <- list(a=list(1:4),b=list(1:6)) 
y <- list(a=list(1:4),b=list(1:6)) 

quando provo:

x+y 

ricevo l'errore: Errore in x + y: argomento non numerico all'operatore binario

X e Y delle lunghezze uguali, e contengono solo numeri interi. Con una matrice è possibile fare y + x, c'è un modo per farlo per liste con liste?

+0

Semplicemente usando "+" non è implementata per 'list'. Questo perché un 'elenco' può contenere qualsiasi oggetto R. Pertanto, non esiste un modo non ambiguo di sommare gli elementi di un 'elenco'. –

risposta

10

È possibile utilizzare lapply di passare attraverso ogni 2 liste contemporaneamente.

lapply(seq_along(x),function(i) 
     unlist(x[i])+unlist(y[i])) 

[[1]] 
a1 a2 a3 a4 
2 4 6 8 

[[2]] 
b1 b2 b3 b4 b5 b6 
2 4 6 8 10 12 

se x e y non hanno la stessa lunghezza, si può fare questo:

lapply(seq_len(min(length(x),length(y)),function(i) 
     unlist(x[i])+unlist(y[i])) 
+0

Un'altra bella risposta !, non conoscevo questo uso di lapply, ho sempre usato lapply su una lista in modo che l'elemento fosse usato nella funzione, ma usando in quel modo non potevo ottenere quell'elemento y. – Jetse

+1

@Jetse lapply può essere iterato attraverso qualsiasi elenco o iteratore. Ma qui la soluzione è 'mapply' – agstudy

+0

Selezionata questa risposta perché questo mantiene la mia struttura di lista. – Jetse

10

assumendo ogni lista ha la stessa struttura, è possibile utilizzare i seguenti mapply

mapply(function(x1, y1) x1[[1]]+y1[[1]], x, y) 
+0

Grazie, mapply era la funzione che stavo cercando! Non conoscevo questa funzione prima, sapevo solo applicare e lappare ... – Jetse

+0

Usalo sul mio set di dati finale, poi ho scoperto che ho perso la mia struttura di lista, agstudy la sua risposta mantiene la mia struttura di lista. – Jetse

+3

@Jetse prova ad aggiungere 'SIMPLIFY = FALSE'. –