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

Ako*_*kos 20 r list

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

我想提取modelset[[1]]$likelihood&modelset[[1]]$fixef,modelset[[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  
Run Code Online (Sandbox Code Playgroud)

Kon*_*lph 52

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

所以,如果你想获得的元素likelihoodfixef,你可以这样写:

modelset[[1]][c('likelihood', 'fixef')]
Run Code Online (Sandbox Code Playgroud)

现在你想为每个元素做到这一点modelset.这是做什么的lapply:

lapply(modelset, function (x) x[c('likelihood', 'fixef')])
Run Code Online (Sandbox Code Playgroud)

这有效,但它不是很像R.

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

lapply(modelset, function (x) `[`(c('likelihood', 'fixef')])
Run Code Online (Sandbox Code Playgroud)

哇,那根本不可读.但是,我们现在可以删除包装匿名function (x),因为我们只是调用另一个函数,并将额外的参数移动到最后一个参数lapply:

lapply(modelset, `[`, c('likelihood', 'fixef'))
Run Code Online (Sandbox Code Playgroud)

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


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

lapply(some_list, function (x) f(x, y))
Run Code Online (Sandbox Code Playgroud)

而这个调用可以写成

lapply(some_list, f, y)
Run Code Online (Sandbox Code Playgroud)

我们确实做到了,和somelist = modelset,f = `[`y = c('likelihood', 'fixef').

  • 要找到像这样的那种不切实际的答案并不容易.谢谢. (5认同)