2013-03-01 5 views
5

Bei drei (oder n Listen):cbind Elemente aus mehreren Listen rekursiv

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

Was würde über die n Listen, eine effizientere Art und Weise des cbind ind jedes Listenelement sein, um dieses Ergebnis zu bekommen?

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" 

Dies funktioniert in Ordnung, wenn n2 oder 3 ist aber geht zu werden ist schnell lächerlich komplex. Gibt es eine effizientere Variante? Ich habe ähnliche Fragen zu S.O. aber haben gekämpft, um sie anzupassen.

Antwort

6

Oder wie folgt aus:.

mapply(cbind, one, two, three) 

Oder wie folgt aus:

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

Sie verarschen mich? Ich schwöre, ich habe es zuerst versucht, aber offensichtlich nicht. Vielen Dank! – thelatemail

7

Verwenden Reduce und Map (Map ist ein einfacher Wrapper für mapply(..., SIMPLIFY = FALSE)

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

Wenn Reduce mit oder die meisten der funktionalen Programmierung Basisfunktionen in R, Sie können in der Regel nicht Argumente in ... passieren, so dass Sie normalerweise brauchen zu schreiben, eine kleine anonyme Funktion zu tun, was Sie wollen

+0

Excellent! Ich hatte mit 'Reduce' gespielt, kam aber nicht schnell voran. Vielen Dank. – thelatemail

+0

+1 für 'Reduce' und' Map' –

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