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

38

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

我想要提取modelset[[1]]$likelihoodmodelset[[1]]$fixefmodelset[[2]]$likelihoodmodelset[[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  

2
lapply(modelset,"[[","likelihood") - Simon O'Hanlon
1个回答

107
为了更加优雅地解决这个问题,您需要理解可以使用['...']来访问列表元素(但是返回的将是一个列表而不是单个元素),而不是使用$...
因此,如果您想获取元素likelihoodfixef,则可以编写如下代码:
modelset[[1]][c('likelihood', 'fixef')]

现在你想对 modelset 中的每个元素都执行相同的操作。这就是 lapply 的作用:

lapply(modelset, function (x) x[c('likelihood', 'fixef')])

这种方法是可行的,但它不太符合R语言的风格。

你知道,在R中,几乎一切都是函数。 [...] 调用了一个名为[的函数(但由于[是R中的特殊符号,需要在反引号中加引号:`[`)。因此,您可以改为编写以下内容:

lapply(modelset, function (x) `[`(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 = modelsetf = `[`y = c('likelihood', 'fixef')


11
很难找到像这个一样教学性强的答案,谢谢。 - Paulo E. Cardoso
1
非常感谢您的帮助性答案和解释。 - Akos
第二个 lapply 行的括号数量有误,我一直没有找到解决方法。用圆括号替换闭合方括号会产生错误的输出。 - randy
1
@randy 谢谢您的注意,确实缺少了 x 参数(除了使用错误的闭括号)。 - Konrad Rudolph

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接