![](/img/trans.png)
[英]How can I extract elements from a list of lists based on element type instead of name or position?
[英]How can I extract elements from lists of lists in R?
我有一堆列表,其中包含列表(廣義線性模型輸出)。 我想編寫一個函數,該函數將從每個列表中提取幾個元素,然后將結果合並到一個數據框中。
我想提取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
為了優雅地解決此問題,您需要了解可以使用['…']
而不是$…
來訪問列表元素(但您將獲得列表而不是單個元素)。
因此,如果您想獲得元素likelihood
和fixef
,可以編寫:
modelset[[1]][c('likelihood', 'fixef')]
現在,您要對modelset
每個元素執行此modelset
。 那就是lapply
所做的:
lapply(modelset, function (x) x[c('likelihood', 'fixef')])
這可行,但不是很像R。
您會發現,在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')
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.