2012-12-06 47 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))) 
相关问题