如何从R中的列表列表中提取元素?

时间:2014-05-20 11:41:55

标签: r list

我有一堆包含列表的列表(广义线性模型输出)。我想编写一个函数,它将从每个列表中提取几个元素,然后将结果合并到一个数据框中。

我想提取modelset[[1]]$likelihood& modelset[[1]]$fixefmodelset[[2]]$likelihood& modelset[[2]]$fixef等,并将结果合并到数据框中。

有人可以告诉我如何做到这一点吗?

道歉,如果我的问题令人困惑:我想做的事情超出了我有限的编程理解。

有关我的清单的更多信息:

modelset: Large list (16 elements, 7.3Mb)
    :List of 29
    ..$ fixef           : Named num [1:2] -1.236 -0.611
    .. ..- attr(*, "names")= chr [1:2] "(Intercept)" "SMIstd"
    ..$ likelihood      :List of 4
    .. ..$ hlik: num 238
    .. ..$ pvh : num 256
    .. ..$ pbvh: num 260
    .. ..$ cAIC: num 567

    ...etc  

1 个答案:

答案 0 :(得分:49)

为了优雅地解决这个问题,您需要了解可以使用['…']代替$…来访问列表元素(但是您将获得一个列表而不是单个元素)。

因此,如果你想获得元素likelihoodfixef,你可以写:

modelset[[1]][c('likelihood', 'fixef')]

现在,您希望为modelset中的每个元素执行此操作。这就是lapply的作用:

lapply(modelset, function (x) x[c('likelihood', 'fixef')])

这样可行,但它不像R一样。

你看,在R中,几乎一切都是一个功能。 […]正在调用名为[的函数(但由于[是R的特殊符号,因此需要在反引号中引用:`[`)。所以你可以写这个:

lapply(modelset, function (x) `[`(c('likelihood', 'fixef')])
哇,这根本不可读。但是,我们现在可以删除包装匿名function (x),因为我们只是调用另一个函数,并将额外的参数移动到lapply的最后一个参数:

lapply(modelset, `[`, c('likelihood', 'fixef'))

这是有效的,是优雅的R代码。


让我们退后一步,重新审视一下我们在这里所做的事情。实际上,我们有一个看起来像这样的表达式:

lapply(some_list, function (x) f(x, y))

此调用可以写成

lapply(some_list, f, y)

我们通过somelist = modelsetf = `[`y = c('likelihood', 'fixef')完成了这一过程。