2013-04-03 91 views
14

給出一個列表數據幀:轉換[R列表缺失/ null元素

alist = list(
    list(name="Foo",age=22), 
    list(name="Bar"), 
    list(name="Baz",age=NULL) 
) 

什麼是將此轉換成與姓名和年齡列的數據框的最佳途徑,缺失值(我會接受NA或「」按照優先順序)?

使用ldply的簡單方法會失敗,因爲它會嘗試將每個列表元素轉換爲數據框,但由於長度不匹配而使用NULL barfs。最好的我目前所面對的是:

> ldply(alist,function(s){t(data.frame(unlist(s)))}) 
    name age 
1 Foo 22 
2 Bar <NA> 
3 Baz <NA> 

但是那是相當噁心和數值變量變成一個因素......

+0

惱人的那種'check.rows = FALSE'還提供了有關具有不同數量的觀測... –

回答

10

註釋提到希望只有一個迴路,它可以與@flodel's answer只是把體內的兩個循環一起實現:

rbind.fill(lapply(alist, function(f) { 
    as.data.frame(Filter(Negate(is.null), f)) 
})) 

name age 
1 Foo 22 
2 Bar NA 
3 Baz NA 
17

第一步:卸下NULL項目

non.null.list <- lapply(alist, Filter, f = Negate(is.null)) 

第二步:堆疊在一起的一切:

library(plyr) 
rbind.fill(lapply(non.null.list, as.data.frame)) 
# name age 
# 1 Foo 22 
# 2 Bar NA 
# 3 Baz NA 

編輯:如果您的所有列表項目的變量爲NULL,則它不會顯示在您的最終輸出中。相反,如果你想充滿NA列,第一步應該不會刪除NULL秒,但與NA小號替換它們:

步驟1替代:用NA替換NULL

non.null.list <- lapply(alist, lapply, function(x)ifelse(is.null(x), NA, x)) 
+0

那第二步是這個問題的主題行錯誤:http://stackoverflow.com/問題/ 15753091 /轉換混合長度命名列表到數據框/ 15753384#15753384,爲此Josh O'Brien有一個更長,但更具擴展性的答案。 – flodel

+0

我堅持只有一個循環/應用步驟的解決方案...否則,這似乎破解它。 – Spacedman