2016-07-13 26 views
6

Dưới đây là một danh sách nhỏ:danh sách không đầy đủ vào dataframe

foo <- list(c("johnny", "joey"), character(0), "deedee") 

[[1]] 
[1] "johnny" "joey" 

[[2]] 
character(0) 

[[3]] 
[1] "deedee" 

Làm thế nào tôi có thể biến nó thành khung dữ liệu này?

list_item name 
1   1 johnny 
2   1 joey 
3   3 deedee 

Tất cả các giải pháp danh sách-tới-dataframe tôi thấy không hoạt động vì danh sách của tôi chưa hoàn chỉnh.

Trả lời

3

Chúng tôi có thể sử dụng stack từ base R sau khi đặt names của 'foo' làm chuỗi 'foo'.

stack(setNames(foo, seq_along(foo))) 
# values ind 
#1 johnny 1 
#2 joey 1 
#3 deedee 3 
5

Dưới đây là một trong những cách có cơ sở R:

data.frame(list_item=rep(seq_along(foo), sapply(foo, length)), 
      name=unlist(foo)) 


## list_item name 
## 1   1 johnny 
## 2   1 joey 
## 3   3 deedee 

Như đã đề cập bởi @RichardScriven trong ý kiến, sapply(foo, length) có thể được thay thế bằng lengths(foo).

7

Chức năng melt của gói reshape2 cũng hoạt động trên danh sách. Vì vậy, bạn có thể sử dụng:

library(reshape2) 
melt(foo) 
# value L1 
#1 johnny 1 
#2 joey 1 
#3 deedee 3 

Tôi tin rằng bạn biết cách thay đổi tên sau đó.

0

này làm việc với các ví dụ đưa ra:

foo <- list(c("johnny", "joey"), character(0), "deedee") 

result=data.frame() 
for(listitem.no in 1:length(foo)){ 
    for(vectoritem in foo[[listitem.no]]) 
    result <- rbind(result, c(listitem.no, as.character(vectoritem)), 
        stringsAsFactors=FALSE) 
} 

HTH, Bernhard

1

melt là siêu mát mẻ (system.time 1,74 cho một danh sách 10k) và unlist giải pháp @jbaums' chỉ nhanh khi sử dụng lengths (1.72), nhưng giải pháp stack của @ akrun thắng vì nó rất nhanh (0,06). Theo dự kiến, vòng lặp chậm nhất (21,86).

Các vấn đề liên quan