2012-12-06 83 views
7

我從我在R中編寫的函數獲得了引導程序統計信息列表的列表。主列表具有1000個引導程序迭代。列表中的每個元素本身都是三件事情的列表,包括四個變量(「fvboot」 - 501x4矩陣)中的每一個的擬合值。從R中的列表元素製作一個向量

我想爲x值的網格上的每個位置(從1:501)和每個變量(從1:4)製作一個向量值。

例如,在第j個變量的Xgrid第i個點,我要讓像下面這樣的載體:

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

,但我這樣做的時候,我得到:

recursive indexing failed at level 2 

谷歌搜索,我想我明白爲什麼R這樣做。但我沒有得到答案,我如何才能將每個fvboot矩陣的第i個元素轉換爲1000x1向量。

幫助將不勝感激。

+0

什麼是'長(bootfits)'?如果是3,那麼你的第一段完全是誤導。如果它是1000,那麼你不能'bootfits $ fvboot'。 – 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

加上unlist(),這很好,謝謝! –

1

您可以使用sapply一次提取一個矢量,對於i = 1和j = 1:

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

sapply執行的功能(在此情況下,我們已經寫一個內聯函數)到列表bootfits的每個元素,並簡化了的結果,如果可能的(即,將其轉換從列表到矢量)。

要提取整組值作爲基質(如在所有我的),你可以在另一個sapply把這個包,但是這一次在我的一個指定記者:

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

警告:還沒有測試過這個代碼,但我認爲它應該可以工作。

4

使用不公開的R.()函數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))) 
相關問題