4

各リスト要素自体が複数の名前オブジェクトを持つ別のリストを保持するリストがあります。これらの名前付きオブジェクトはそれぞれ、同じ長さのベクトルです。私の目標は、ベクトルを連結することによって、関連するオブジェクト (同じ名前のオブジェクト) をマトリックスに効率的に結合することです。

これは、私が取り組んでいる構造のタイプの例です。ただし、現在のアプリケーションでは、並列化されたマルチレベル モデルであるため、mclapply から来ており、リストのリストを取得する方法はないと思います。

> 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 などを巧みに使用してそれを行うより良い方法があるに違いないようです。

4

2 に答える 2

5
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 

または、リスト要素の両方のセットを一度に処理するには:

elems <- c("t", "p")
sapply(elems, function(E) {
     do.call(cbind,
             lapply(test, function(X) {
                 X[[E]]
             }))
}, simplify=FALSE)
# $t
#           [,1]       [,2]     [,3]     [,4]
# [1,] 1.9226614 0.66463844 2.558517 2.743381
# [2,] 3.0026400 0.03238983 2.195404 3.824127
# [3,] 0.9371057 3.54638107 2.968717 2.434471
# 
# $p
#           [,1]     [,2]     [,3]     [,4]
# [1,] 0.8544413 2.942780 4.693698 4.158212
# [2,] 0.7172070 2.381438 4.869630 3.503361
# [3,] 3.1369674 2.464447 2.484968 3.626174
于 2013-02-12T18:47:32.193 に答える
3

を使用するのはどうですかunlist(test, recursive = FALSE)。ただし、「p」と「t」を分離したい場合は、複数のステップで実行する必要があります。ここにそれらが一緒にあります:

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

それらを分離するのは非常に簡単です。

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)
})
于 2013-02-12T18:52:08.773 に答える