说我有一个清单:
mylist=list(list(data.frame(a=3,b=2,c=4),data.frame(d=5,e=6,h=8),data.frame(k=2,e=3,b=5,m=5)),
list(data.frame(a=32,b=22,c=42),data.frame(d=5,e=63,h=82),data.frame(k=2,e=33,b=5,m=5)),
list(data.frame(a=33,b=21,k=41,c=41),data.frame(d=5,e=61,h=80),data.frame(k=22,e=3,b=5,m=5)))
Run Code Online (Sandbox Code Playgroud)
然后我尝试按列表的cbind每个元素获取一个新列表,例如cbind mylist[[1]][[1]]with mylist[[2]][[1]]和mylist[[3]][[1]]
功能:
newlist=lapply(seq_along(mylist[[1]]), function(x){
newlist=Reduce("cbind",c(mylist[[1]][x],mylist[[-1]][x]))
return(newlist)
})
I get:
Error in mylist[[-1]] : attempt to select more than one element
Run Code Online (Sandbox Code Playgroud)
但如果列表只是:lapply工作:
mylistshort=mylist[-3]
Run Code Online (Sandbox Code Playgroud)
期望的结果是:
[[1]]
a b c a b c a b k c
1 3 2 4 32 22 42 33 21 41 41
[[2]]
d e h d e h d e h
1 5 6 8 5 63 82 5 61 80
[[3]]
k e b m k e b m k e m
1 2 3 5 5 2 33 5 5 22 3 5
Run Code Online (Sandbox Code Playgroud)
那么如何减少长度大于2的列表呢?最好的祝福
另一个想法:
.mapply(cbind, mylist, NULL)
#[[1]]
# a b c a b c a b k c
#1 3 2 4 32 22 42 33 21 41 41
#
#[[2]]
# d e h d e h d e h
#1 5 6 8 5 63 82 5 61 80
#
#[[3]]
# k e b m k e b m k e b m
#1 2 3 5 5 2 33 5 5 22 3 5 5
Run Code Online (Sandbox Code Playgroud)
编辑: 一些评论
基本上,你正在寻找一个"矢量化" cbind.你可以使用一个for循环,但R有一个内置的"矢量化"工具:( mapply不是必须更快,但更干净).mapply对于特定数量的参数,您可以使用如下:
mapply(function(x, y, z) cbind(x, y, z), mylist[[1]], mylist[[2]], mylist[[3]])
Run Code Online (Sandbox Code Playgroud)
但是,您也可以通过"可变长度参数"(...)来使其更实用:
mapply(function(...) cbind(...), mylist[[1]], mylist[[2]], mylist[[3]])
Run Code Online (Sandbox Code Playgroud)
cbind是为了知道如何处理...参数而构建的:
mapply(cbind, mylist[[1]], mylist[[2]], mylist[[3]])
Run Code Online (Sandbox Code Playgroud)
这仍然不灵活,因为您必须指定每个参数,因为mapply只接受....do.call对于在"列表"中有函数参数的情况很方便:
do.call(mapply, c(cbind, mylist))
Run Code Online (Sandbox Code Playgroud)
R,有一个点缀mapply,接受它...作为列表的参数,看起来更酷,并可以取代do.call:
.mapply(FUN = cbind, dots = mylist, MoreArgs = NULL)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
484 次 |
| 最近记录: |