2013-03-01 38 views
5

Với ba (hoặc n danh sách):mục cbind từ nhiều danh sách đệ quy

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

Điều gì sẽ là một cách hiệu quả hơn cbind ind mỗi mục trên n danh sách, để có được kết quả này?

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ày hoạt động ổn khi n2 hoặc 3 nhưng nhanh chóng sẽ trở thành lố bịch phức tạp. Có một biến thể hiệu quả hơn về điều này không? Tôi đã thấy những câu hỏi tương tự trên S.O. nhưng phải vật lộn để thích ứng với chúng.

Trả lời

6

Hoặc như thế này:

mapply(cbind, one, two, three) 

Hoặc như thế này:

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

Bạn đang đùa tôi? Tôi thề tôi đã thử cái đầu tiên, nhưng rõ ràng là không. Cảm ơn! – thelatemail

7

Sử dụng ReduceMap (Map là một wrapper đơn giản cho mapply(..., SIMPLIFY = FALSE)

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

Khi sử dụng Reduce hoặc hầu hết các chức năng cơ bản lập trình chức năng trong R, bạn thường không thể vượt qua đối số trong ... vì vậy bạn thường cần để viết một chức năng ẩn danh nhỏ để làm những gì bạn muốn.

+0

Tuyệt vời! Tôi đã chơi với 'Reduce' nhưng đã nhanh chóng nhận ra. Cảm ơn nhiều. – thelatemail

+0

+1 cho 'Giảm' và' Bản đồ ' –

2
sep.list <- unlist(list(one, two, three), recursive = FALSE) 
lapply(split(sep.list, names(sep.list)), do.call, what = cbind) 
Các vấn đề liên quan