2014-05-20 56 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