2012-12-06 17 views
7

私はRで書いた関数からブートストラップ統計のリストを得ました。メインリストには10​​00回のブートストラップ反復があります。リスト内の各要素は、4つの変数(「fvboot」 - 501x4行列)のそれぞれに適合した値を含む3つのもののリストです。リスト要素からベクトルを作るR

私はx値のグリッド上の各位置の値のベクトルを1:501から、そして各変数に対して1:4から作りたいと思っています。

例えば、j番目の変数のXgridの上のi番目のポイントのために、私は次のようなベクトルを作りたい:

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

が、私はこれを行うとき、私は得る:

recursive indexing failed at level 2 

私はなぜRがこれをやっているのか理解していると思います。しかし、私はどのように私は各fvboot行列のijth要素を1000x1ベクトルに得ることができるかの答えを得ていない。

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

+0

は ''長(bootfits)とは何ですか?それが3の場合、最初の段落はまったく誤解を招きます。 1000ならば、 'bootfits $ fvboot'を実行することはできません。 unlist()が追加された – flodel

答えて

4

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

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

あなたはplyrに精通していない場合:私はいつもハドレーウィッカムの記事は、「The split-apply-combine strategy for data analysis」非常に有用であることが判明しました。

+0

は素晴らしいことですが、ありがとう! –

1

サプリーを使用して一度に1つのベクトルを抽出することができます。

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

sapplyリストbootfitsの各要素に関数(我々が書かれているこの場合のインライン関数)を行い、即ち、(可能それを変換する場合、結果を簡素化した:i = 1及びj = 1のためリストからベクターへ)。 (全てのiの上など)行列としての値のセット全体を抽出するために

あなたが別のsapplyでこれをラップすることができますが、指定されたjのためのiのオーバーこの時間:

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

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

example(unlist)からR.中
4

利用非公開に()関数に、

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))) 
関連する問題