我有一堆包含列表的列表(广义线性模型输出)。我想编写一个函数,它将从每个列表中提取几个元素,然后将结果合并到一个数据框中。
我想提取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
答案 0 :(得分:49)
为了优雅地解决这个问题,您需要了解可以使用['…']
代替$…
来访问列表元素(但是您将获得一个列表而不是单个元素)。
因此,如果你想获得元素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')
完成了这一过程。