在 R 语言中,如何从列表元素创建一个向量

10
我有一个由R编写的函数生成的自举统计信息列表,其中主列表有1000个自举迭代。列表中的每个元素本身都是一个包含三个内容的列表,包括每个变量的拟合值(“fvboot” - 一个501x4矩阵)。
我想为从1:501的x值网格上的每个位置和从1:4的每个变量创建一个值的向量。
例如,对于第j个变量的xgrid上的第i个点,我想要创建以下向量:
        vec = bootfits$fvboot[[1:1000]][i,j]

但是当我这样做时,我会得到:

recursive indexing failed at level 2

搜索了一下,我想我明白R为什么这样做了。但我没有找到如何将每个fvboot矩阵的第ij个元素放入1000x1向量中的答案。

非常感谢帮助。


length(bootfits)是什么?如果是3,则你的第一段完全是误导性的。如果是1000,则你无法执行bootfits$fvboot - flodel
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)))

4

如果您提供一个最小化的示例对象,那么这将更容易。通常情况下,您不能使用向量索引列表,例如[[1:1000]]。我建议使用plyr函数。以下代码应该可以实现(尽管我没有测试它):

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

如果您不熟悉plyr,我始终认为Hadley Wickham的文章“数据分析中的拆分-应用-组合策略”非常有用。

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接