10

Rで記述した関数からのブートストラップ統計のリストのリストがあります。メインリストには、1000回のブートストラップ反復が含まれています。リスト内の各要素は、それ自体が3つのリストであり、4つの変数( "fvboot"-501x4行列)のそれぞれの近似値が含まれます。

x値のグリッド上の各位置の値のベクトルを1:501から、各変数の値を1:4から作成したいと思います。

たとえば、j番目の変数のxgridのi番目のポイントについて、次のようなベクトルを作成します。

        vec = bootfits$fvboot[[1:1000]][i,j]

しかし、これを行うと、次のようになります。

recursive indexing failed at level 2

ぐるぐる回って、なぜRがこれをしているのか理解できたと思います。しかし、各fvboot行列のij番目の要素を1000x1のベクトルに変換する方法についての答えは得られていません。

助けていただければ幸いです。

4

3 に答える 3

6

Rでunlist()関数を使用します。From example(unlist)

unlist(options())
unlist(options(), use.names = FALSE)

l.ex <- list(a = list(1:5, LETTERS[1:5]), b = "Z", c = NA)
unlist(l.ex, recursive = FALSE)
unlist(l.ex, recursive = TRUE)

l1 <- list(a = "a", b = 2, c = pi+2i)
unlist(l1) # a character vector
l2 <- list(a = "a", b = as.name("b"), c = pi+2i)
unlist(l2) # remains a list

ll <- list(as.name("sinc"), quote( a + b ), 1:10, letters, expression(1+x))
utils::str(ll)
for(x in ll)
  stopifnot(identical(x, unlist(x)))
于 2014-09-25T16:21:27.637 に答える
4

最小限のサンプルオブジェクトを指定すると、これは簡単になります。一般に、のようなベクトルでリストにインデックスを付けることはできません[[1:1000]]。関数を使用しplyrます。これでうまくいくはずです(私はテストしていませんが):

require("plyr")
laply(bootfits$fvboot,function(l) l[i,j])

よく知らない場合plyr:私は常にハドリーウィッカムの記事「データ分析のための分割-適用-結合戦略」が非常に役立つことを発見しました。

于 2012-12-06T22:08:17.893 に答える
2

sapplyを使用して、一度に1つのベクトルを抽出できます。たとえば、i =1およびj=1の場合:

i <- 1
j <- 1
vec <- sapply(bootfits, function(x){x$fvboot[i,j]})

sapplyは、リストbootfitsの各要素に対して関数(この場合は私たちが作成したインライン関数)を実行し、可能であれば結果を単純化します(つまり、リストからベクトルに変換します)。

値のセット全体を行列として(たとえば、すべてのiに対して)抽出するには、これを別のsapplyでラップできますが、今回は、指定されたjのiに対して:

j <- 1
mymatrix <- sapply(1:501, function(i){
    sapply(bootfits, function(x){x$fvboot[i,j]})
})

警告:このコードはテストしていませんが、機能するはずです。

于 2012-12-06T23:54:38.973 に答える