2013-03-01 3 views
5

Даны три (или n списков):cbind элементы из нескольких списков рекурсивно

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

Что бы быть более эффективным способом cbind тх каждый элемент списка поперек n списков, чтобы получить этот результат?

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" 

Это работает хорошо, когда n является 2 или 3, но быстро собирается стать смехотворно сложным. Есть ли более эффективная вариация на этом? Я видел подобные вопросы по С.О. но изо всех сил пытались их адаптировать.

ответ

6

Или как это:.

mapply(cbind, one, two, three) 

Или так:

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

Ты издеваешься? Клянусь, я попробовал этот первый, но, очевидно, я этого не сделал. Благодаря! – thelatemail

7

Использование Reduce и Map (Map быть простой оберткой для mapply(..., SIMPLIFY = FALSE)

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

При использовании Reduce или большинство функциональных программирования базовых функций в R, то, как правило, не может передать аргументы в ... так что вам обычно требуется написать небольшую анонимную функцию, чтобы делать то, что вы хотите

+0

Отлично! Я играл с «Сокращением», но никуда не спешил. Большое спасибо. – thelatemail

+0

+1 для 'Уменьшить' и' Карта' –

2
sep.list <- unlist(list(one, two, three), recursive = FALSE) 
lapply(split(sep.list, names(sep.list)), do.call, what = cbind) 
Смежные вопросы