2015-08-17 40 views
10

Tôi có một danh sách liệt kê tên của các hình thức sau đây từ một đối tượng JSON:danh sách liệt kê tên để data.frame

my_list = list(list(a = 10, b = "blah"), 
       list(a = 15, b = "stuff")) 

Mỗi phần tử của danh sách bên ngoài là một danh sách tên và tôi muốn chuyển đổi nó vào một data.frame của biểu mẫu sau có tên cột nguyên vẹn:

a b 
10 "blah" 
15 "stuff" 

Trên bề mặt, tôi có thể đạt được điều này bằng cách thực hiện to_df = data.frame(do.call(rbind, my_list)).

Tuy nhiên, nếu tôi là để cố gắng trích xuất một cột cá nhân sử dụng to_df$a hoặc to_df[,1] tôi sẽ nhận được một danh sách thay vì một vector như bình thường mong đợi từ một data.frame:

> to_df[,1] 
[[1]] 
[1] 10 

[[2]] 
[1] 15 

Thay vì:

> to_df[,1] 
[1] 10 15 

Bài đăng cũ trên danh sách gửi thư R đề xuất giải pháp sau: to_df = as.data.frame(t(sapply(my_list, rbind))). Nhưng không chỉ điều này không chuyển qua các tên cột, nó vẫn có cùng một vấn đề trả về một danh sách thay vì một vector khi nhìn vào các cột riêng lẻ sử dụng to_df[,1].

Cách tốt nhất để đạt được điều này là gì? Có cách nào dplyr không?

EDIT: Cảm ơn tất cả các giải pháp, xuất hiện mẹo là lapply và chuyển đổi từng thành phần của danh sách thành data.frame và sau đó liên kết chúng với nhau bằng dplyr hoặc do.call. Ngoài ra, data.table thực hiện hầu hết công việc với một cuộc gọi đến rbindlist.

+4

Bạn có thể thử 'lapply (my_list, data.frame)%>% bind_rows()' –

+1

Bạn có một số giải pháp khả thi bên dưới. Nhưng bạn nên lưu ý rằng 'to_df = data.frame (do.call (rbind, my_list))' không xuất hiện để cung cấp cho bạn một 'data.frame'. Nó xuất hiện để cung cấp cho bạn một 'danh sách' dựa trên đầu ra bạn hiển thị. –

Trả lời

10

Tôi thích rbindlist từ gói data.table. Nó đơn giản, nhanh chóng và trả về một khung/bảng dữ liệu.

data.table::rbindlist(my_list) 
#  a  b 
# 1: 10 blah 
# 2: 15 stuff 

Một ưu điểm khác của rbindlist() là nó sẽ tự động điền vào các giá trị thiếu với NA.

Để loại bỏ các lớp data.table, bạn chỉ có thể bọc trong as.data.frame()

as.data.frame(data.table::rbindlist(my_list)) 
6

Trong cơ sở R bạn có thể làm

df<-do.call(rbind,lapply(my_list,data.frame)) 
5

Dường như bạn có thể làm điều này với bind_rows từ phiên bản phát triển của dplyr, dplyr_0.4.2.9002, kể từ hai ngày trước.

library(dplyr) 
bind_rows(my_list) 

Source: local data frame [2 x 2] 

    a  b 
1 10 blah 
2 15 stuff 
Các vấn đề liên quan