给出三个(或n
个列表):
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
但很快就会变得荒谬复杂时,此功能正常。
这有更有效的变化吗?我在S.O.上看过类似的问题。但一直在努力适应它们。
答案 0 :(得分:7)
使用Reduce
和Map
(Map
是mapply(..., SIMPLIFY = FALSE)
的简单包装
Reduce(function(x,y) Map(cbind, x, y),list(one, two,three))
在R中使用Reduce
或大多数函数式编程基函数时,通常无法在...
中传递参数,因此通常需要编写一个小的匿名函数来执行您想要的操作。
答案 1 :(得分:6)
或者像这样:
mapply(cbind, one, two, three)
或者像这样:
mylist <- list(one, two, three)
do.call(mapply, c(cbind, mylist))
答案 2 :(得分:2)
sep.list <- unlist(list(one, two, three), recursive = FALSE)
lapply(split(sep.list, names(sep.list)), do.call, what = cbind)