Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 将相关嵌套列表元素向量组合到矩阵中_R_List - Fatal编程技术网

R 将相关嵌套列表元素向量组合到矩阵中

R 将相关嵌套列表元素向量组合到矩阵中,r,list,R,List,我有一个列表,其中每个列表元素本身包含另一个包含多个名称和对象的列表。每个命名对象都是相同长度的向量。我的目标是通过合并向量将相关对象(同名对象)有效地组合成矩阵 这是我正在使用的结构类型的一个示例。然而,在当前的应用程序中,它来自McLappy,因为它是一个并行的多层次模型,我认为没有办法获取列表列表 > test=lapply(1:2,function(x){out = list(); out$t=rnorm(3)+x; out$p =rnorm(3)+ x+.1; return(ou

我有一个列表,其中每个列表元素本身包含另一个包含多个名称和对象的列表。每个命名对象都是相同长度的向量。我的目标是通过合并向量将相关对象(同名对象)有效地组合成矩阵

这是我正在使用的结构类型的一个示例。然而,在当前的应用程序中,它来自McLappy,因为它是一个并行的多层次模型,我认为没有办法获取列表列表

> test=lapply(1:2,function(x){out = list(); out$t=rnorm(3)+x; out$p =rnorm(3)+ x+.1; return(out)})
> test
[[1]]
[[1]]$t
[1] 0.5950165 0.8827352 0.5614947

[[1]]$p
[1] 2.6144102 1.9688743 0.6241944


[[2]]
[[2]]$t
[1] 2.562030 1.832571 3.018756

[[2]]$p
[1] 1.7431969 0.5305784 2.6935106
这里有一个简单的方法来实现我想要的

> t.matrix = cbind(test[[1]]$t,test[[2]]$t)
> t.matrix
           [,1]     [,2]
[1,]  2.2094525 2.634907
[2,] -0.2822453 2.440666
[3,]  1.1704518 2.483424
但是我希望能够为一个很长的列表(大约100万个元素)执行此操作,而我当前的解决方案无法扩展


我想我可以使用for循环,但似乎必须有更好的方法,巧妙地使用reduce、unlist或sapply之类的工具。

test如何使用
unlist(test,recursive=FALSE)
。但是,如果您希望“p”和“t”分开,则需要在多个步骤中完成。他们在一起:

test <- lapply(1:4, function(x) { 
          out = list(); out$t=rnorm(3)+x; out$p =rnorm(3)+ x+.1; return(out)})

do.call(cbind, lapply(test, function(X) X[["t"]]))
## do.call(cbind, lapply(test, "[[", "t"))          ## Or, equivalently 
#           [,1]      [,2]     [,3]     [,4] 
# [1,] 0.7382887 0.9248296 4.205222 5.847823 
# [2,] 3.0321069 3.6806652 3.324739 3.695195 
# [3,] 2.3611483 1.9305901 1.574586 4.287534 
temp <- do.call(cbind, unlist(test, recursive = FALSE))
temp
             t         p        t        p
[1,] 0.3735462 2.6952808 2.487429 1.794612
[2,] 1.1836433 1.4295078 2.738325 3.611781
[3,] 0.1643714 0.2795316 2.575781 2.489843
以下是我使用的数据:

set.seed(1)
test <- lapply(1:2, function(x) {
  out = list()
  out$t=rnorm(3)+x
  out$p =rnorm(3)+ x+.1
  return(out)
})
set.seed(1)

测试当你分享这类问题时使用
set.seed()
总是很好的,这样我们就可以比较我们得到的输出和你想要得到的。谢谢你的提示!我以后一定会这么做的。谢谢你的回答,请投你一票。然而,我对unlist的一个犹豫是,我看到的基准测试表明,在名称打开的情况下使用unlist要慢得多。我想我可以使用你的解决方案,并关闭useNames标志,但这会使重建过程变得有点棘手。@DanielKessler,谢谢你分享这个链接。我不知道在使用unlist时保留名称会使函数慢得多!如果你知道你的数据组织得很好,我想一个解决办法是在最后选择奇数列和偶数列,但这可能是容易出错的。我认为乔希的方法在这里绝对是最合适的。
temp[, colnames(temp) %in% "t"]
#              t        t
# [1,] 0.3735462 2.487429
# [2,] 1.1836433 2.738325
# [3,] 0.1643714 2.575781
temp[, colnames(temp) %in% "p"]
#              p        p
# [1,] 2.6952808 1.794612
# [2,] 1.4295078 3.611781
# [3,] 0.2795316 2.489843
set.seed(1)
test <- lapply(1:2, function(x) {
  out = list()
  out$t=rnorm(3)+x
  out$p =rnorm(3)+ x+.1
  return(out)
})