Skip to main content
 首页 » 编程设计

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

2025年02月15日52xxx_UU

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

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

请您参考如下方法:

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

所以如果你想获取元素 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 = modelset , f = `[`y = c('likelihood', 'fixef') .