2013-03-01 18 views
5

Verilen üç (veya n listeleri):cbind ürün yinelemeli

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

Bunun sonucu elde etmek için n listelerinin genelinde her liste öğesinin ind cbind daha verimli şekilde, olurdu? n2 veya 3 ama çabuk gülünç karmaşık hale gelecek zaman

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" 

tamam çalışır. Bu konuda daha verimli bir varyasyon var mı? S.O. ile ilgili benzer sorular gördüm. ama onları adapte etmek için mücadele ettiler. Reduce kullanılarak ya da R işlevsel programlama temel fonksiyonların çoğu, genellikle çok normalde gereken ... bağımsız değişkenler geçemez zaman

cevap

6

Ya da böyle.

mapply(cbind, one, two, three) 

Ya da böyle:

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

Şaka mı yapıyorsun? Yemin ederim ki bunu ilk denedim ama belli ki yapmadım. Teşekkürler! – thelatemail

7

kullanımı Reduce ve Map (Mapmapply(..., SIMPLIFY = FALSE)

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

için basit bir sargı olarak ne istediğinizi yapmak için küçük anonim işlevi yazmak

+0

Mükemmel! 'Azalt' ile oynamıştım ama hiçbir yere hızlı gitmiyordum. Çok teşekkürler. – thelatemail

+0

+1 “Reduce” ve “Map” –

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