2013-04-03 16 views
14

Cho một danh sách:Chuyển đổi danh sách R để dataframe với các yếu tố còn thiếu/NULL

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

là những cách tốt nhất để chuyển đổi này vào một dataframe với tên và tuổi cột, với các giá trị còn thiếu (Tôi sẽ chấp nhận NA hay "" theo thứ tự ưu tiên đó)?

Phương pháp đơn giản sử dụng ldply không thành công vì nó cố chuyển đổi từng phần tử danh sách thành một khung dữ liệu, nhưng một với thanh bar NULL vì độ dài không khớp. Tôi tốt nhất có tại thời điểm này là:

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

nhưng đó là khá icky và biến số sẽ trở thành một yếu tố ...

+0

Loại phiền toái rằng 'check.rows = FALSE' vẫn đưa ra lỗi về các hàng có số quan sát khác nhau ... –

Trả lời

10

Một bình luận nêu muốn chỉ một vòng duy nhất, mà có thể đạt được với @flodel's answer chỉ bằng cách đặt cơ thể của hai vòng với nhau:

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

cho

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

Bước 1: loại bỏ NULL mục

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

Bước 2: ngăn xếp mọi thứ lại với nhau :

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

Chỉnh sửa: Trong trường hợp bạn có biến là NULL cho tất cả các mục trong danh sách của bạn, nó sẽ không hiển thị trong kết quả cuối cùng của bạn. Nếu thay vào đó, bạn muốn một cột đầy NA, bước đầu tiên không nên loại bỏ NULL s nhưng thay thế bằng NA s:

Bước 1 thay thế: thay thế NULL với NA:

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

Bước thứ hai là chủ đề của câu hỏi này: http://stackoverflow.com/ câu hỏi/15753091/convert-mixed-length-named-list-to-data-frame/15753384 # 15753384, trong đó Josh O'Brien có câu trả lời dài hơn nhưng có khả năng mở rộng hơn. – flodel

+0

Tôi đang nắm giữ một giải pháp chỉ có một vòng lặp/áp dụng bước ... Nếu không, điều này có vẻ như để crack nó. – Spacedman