我从R中编写的函数中获得了引导程序统计信息列表的列表。主列表包含1000次引导迭代。列表中的每个元素本身都是三个列表的列表,包括四个变量中每个变量的拟合值(“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矩阵的ijth元素转换为1000x1向量的答案。
帮助将非常感激。
答案 0 :(得分:6)
在R中使用unlist()函数。来自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)))
答案 1 :(得分:4)
如果您提供最小的示例对象,这将更容易。通常,您不能使用[[1:1000]]
等向量对列表进行索引。我会使用plyr
函数。这应该这样做(虽然我还没有测试过):
require("plyr")
laply(bootfits$fvboot,function(l) l[i,j])
如果您不熟悉plyr
:我总是发现Hadley Wickham的文章“The split-apply-combine strategy for data analysis”非常有用。
答案 2 :(得分:2)
您可以使用sapply一次提取一个向量,例如对于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]})
})
警告:我没有测试过这段代码,但我认为它应该可行。