从R中的列表元素制作矢量

时间:2012-12-06 21:49:43

标签: r list

我从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向量的答案。

帮助将非常感激。

3 个答案:

答案 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]})
})

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