2013-03-07 20 views
11

Czy istnieje prosty sposób na proste obliczenia na liście?suma dwóch list z listami w R

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

Podczas próby:

x+y 

, że komunikat o błędzie: błąd w x + y: argumentu nienumeryczny do operatora binarnego

x i y są równe długości i zawierają tylko liczby całkowite. Z matrycą można zrobić y + x, czy istnieje sposób, aby to zrobić dla list z listami?

+0

prostu za pomocą "+" nie jest realizowany dla 'list'. Dzieje się tak dlatego, że 'list' może zawierać dowolny obiekt R. Dlatego nie ma jednoznacznego sposobu dodawania elementów "listy". –

Odpowiedz

10

Można użyć lapply przejść przez każde 2 list jednocześnie.

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 

jeśli x i y nie mają taką samą długość, można to zrobić:

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

Kolejna fajna odpowiedź !, nie znałem tego użycia lapply, zawsze używałem lapply na liście, więc element był używany w funkcji, ale używając tego sposobu nie mogłem dostać tego elementu y. – Jetse

+1

@Jetse lapply można iterować za pomocą dowolnej listy lub iteratora. Ale tutaj rozwiązaniem jest "mapply" – agstudy

+0

Wybrano tę odpowiedź, ponieważ zachowuje ona moją strukturę listy. – Jetse

10

zakładając Każda lista ma taką samą strukturę, można użyć mapply następująco

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

Dzięki, mapply była funkcją, której szukałem! Nie znałem tej funkcji wcześniej, wiedziałem tylko, że aplikuję i lapply ... – Jetse

+0

Użyłem go na moim ostatecznym zbiorze danych, potem odkryłem, że straciłem strukturę listy, agstudy jego odpowiedź zachowuje moją strukturę list. – Jetse

+3

@Jetse spróbuj dodać 'UPORZĄDZANIE = FALSE'. –