我会使用dplyr包的速度,将结构化列表转换为整洁的数据框。我想知道我现在发布的解决方案是否是“最先进的”,或者是否有更快的方法。
这是我开始列表的一个示例:
通过这个结果(为您展示玩具结构):
现在我将使用一个方便的函数来重新排列数据并使用
现在dplyr发挥了魔力:
有一种更快、更优雅、更紧凑的方法可以用dplyr来完成吗?
这是我开始列表的一个示例:
l = list()
l[[1]] = list(member1=c(a=rnorm(1)),member2=matrix(rnorm(3),nrow=3,ncol=1,dimnames=list(c(letters[2:4]),c("sample"))))
l[[2]] = list(member1=c(a=rnorm(1)),member2=matrix(rnorm(3),nrow=3,ncol=1,dimnames=list(c(letters[2:4]),c("sample"))))
l[[3]] = list(member1=c(a=rnorm(1)),member2=matrix(rnorm(3),nrow=3,ncol=1,dimnames=list(c(letters[2:4]),c("sample"))))
通过这个结果(为您展示玩具结构):
l
[[1]]
[[1]]$member1
a
0.3340196
[[1]]$member2
sample
b 1.0098830
c 0.6413375
d 0.9080675
[[2]]
[[2]]$member1
a
0.0590878
[[2]]$member2
sample
b 0.5585736
c -0.5936157
d -0.3985687
[[3]]
[[3]]$member1
a
0.06242458
[[3]]$member2
sample
b -0.2873391
c 0.5326067
d -1.1635551
现在我将使用一个方便的函数来重新排列数据并使用
lapply
遍历列表:organizeSamples = function(x){
member = x$member2
output = data.frame(key=rownames(member),value=member[,1])
return(output)
}
l_new = lapply(l, organizeSamples)
现在dplyr发挥了魔力:
samples = dplyr::bind_rows(l_new)
samples :
key value
1 b 1.0098830
2 c 0.6413375
3 d 0.9080675
4 b 0.5585736
5 c -0.5936157
6 d -0.3985687
7 b -0.2873391
8 c 0.5326067
9 d -1.1635551
有一种更快、更优雅、更紧凑的方法可以用dplyr来完成吗?
[[
语法。但我一定会尝试并使用microbenchmark包在更大的列表上进行测试...顺便说一下,我喜欢管道系统! - Fabio