10

我有一个我用 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 矩阵的第 ij 个元素转换为 1000x1 向量的答案。

帮助将不胜感激。

4

3 回答 3

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)))
于 2014-09-25T16:21:27.637 回答
4

如果你给出一个最小的示例对象,这会更容易。通常,您不能使用诸如[[1:1000]]. 我会使用这些plyr功能。这应该可以做到(虽然我没有测试过):

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

如果您不熟悉plyr:我总是发现 Hadley Wickham 的文章“数据分析的拆分-应用-组合策略”非常有用。

于 2012-12-06T22:08:17.893 回答
2

您可以使用 sapply 一次提取一个向量,例如对于 i=1 和 j=1:

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

sapply 对列表 bootfits 的每个元素执行函数(在本例中是我们编写的内联函数),并尽可能简化结果(即,将其从列表转换为向量)。

要将一整套值提取为矩阵(例如,在所有 i 上),您可以将其包装在另一个 sapply 中,但这次在 i 上用于指定 j:

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

警告:我没有测试过这段代码,但我认为它应该可以工作。

于 2012-12-06T23:54:38.973 回答