2013-03-01 12 views
5

podawane trzy (lub n wymienia):cbind elementy z wielu list rekurencyjnie

one <- list(a=1:2,b="one") 
two <- list(a=2:3,b="two") 
three <- list(a=3:4,b="three") 

Jaki byłby bardziej efektywny sposób cbind ind każdego elementu listy całej listach n, aby uzyskać ten wynik?

mapply(cbind,mapply(cbind,one,two,SIMPLIFY=FALSE),three,SIMPLIFY=FALSE) 

$a 
    [,1] [,2] [,3] 
[1,] 1 2 3 
[2,] 2 3 4 

$b 
    [,1] [,2] [,3] 
[1,] "one" "two" "three" 

Działa to dobrze, gdy n jest 2 lub 3 ale szybko staną się śmiesznie skomplikowany. Czy jest na to bardziej skuteczna odmiana? Widziałem podobne pytania na temat S.O. ale starają się je dostosować.

Odpowiedz

6

Lub tak:.

mapply(cbind, one, two, three) 

Albo tak:

mylist <- list(one, two, three) 
do.call(mapply, c(cbind, mylist)) 
+0

Żartujesz ze mnie? Przysięgam, że próbowałem tego pierwszego, ale oczywiście tego nie zrobiłem. Dzięki! – thelatemail

7

Zastosowanie Reduce i Map (Map jest prosty wrapper dla mapply(..., SIMPLIFY = FALSE)

Reduce(function(x,y) Map(cbind, x, y),list(one, two,three)) 

Podczas korzystania Reduce lub najbardziej funkcjonalnych funkcji bazowych programowania w R, zwykle nie można przekazywać argumenty w ... tak normalnie potrzebujemy napisać mały funkcję anonimową robić to, co chcesz

+0

Doskonała! Grałem z "Reduce", ale nie było szybko. Wielkie dzięki. – thelatemail

+0

+1 za "Zmniejszenie" i "Mapa" –

2
sep.list <- unlist(list(one, two, three), recursive = FALSE) 
lapply(split(sep.list, names(sep.list)), do.call, what = cbind) 
Powiązane problemy