我有一堆列表,其中包含列表(广义线性模型输出)。我想编写一个函数,该函数将从每个列表中提取多个元素,然后将结果组合到一个数据框中。
我要提取 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
请您参考如下方法:
为了优雅地解决这个问题,您需要了解您可以使用 ['…']
而不是 $…
访问列表元素(但您将返回一个列表而不是单个元素)。
所以如果你想获取元素 likelihood
和 fixef
, 你可以写:
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 = modelset
,
f = `[`
和
y = c('likelihood', 'fixef')
.