2014-05-20 57 views
10

我有一堆包含列表中的列表(广义线性模型输出)。我想写一个函数,它会从每个列表中提取几个元素,然后将结果合并到一个数据框中。如何从R列表中提取元素?

我想提取modelset[[1]]$likelihood & modelset[[1]]$fixefmodelset[[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 
+1

'lapply(modelset,“[[”,“likelihood”)'etc ... –

回答

29

为了能够完美地解决这个问题,你要明白,你可以使用的['…']代替$…访问列表元素(但你会得到一个列表,而不是一个个别元素)。

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

+3

不容易找到像这样的这样的didatic答案。谢谢。 –

+0

感谢您提供非常有用的答案和解释。 – Akos