我有一堆包含列表的列表(广义线性模型输出).我想编写一个函数,它将从每个列表中提取几个元素,然后将结果合并到一个数据框中.
我想提取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
为了优雅地解决这个问题,您需要了解可以使用['…']
而不是$…
访问列表元素(但是您将获得列表而不是单个元素).
所以,如果你想获得的元素likelihood
和fixef
,你可以这样写:
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')
.
归档时间: |
|
查看次数: |
19392 次 |
最近记录: |