【问题标题】:How can I extract elements from lists of lists in R?如何从 R 中的列表中提取元素?
【发布时间】:2014-07-08 15:49:44
【问题描述】:

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

我想提取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  

【问题讨论】:

  • lapply( modelset , "[[" , "likelihood" ) 等等...

标签: r list


【解决方案1】:

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

所以如果要获取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')

【讨论】:

  • 很难找到像这样的教学答案。谢谢。
  • 感谢您非常有帮助的回答和解释。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-29
  • 1970-01-01
  • 1970-01-01
  • 2022-06-23
相关资源
最近更新 更多