2016-07-13 6 views
6

Вот небольшой список:неполный список в dataframe

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

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

[[2]] 
character(0) 

[[3]] 
[1] "deedee" 

Как я могу превратить его в этот кадр данных?

list_item name 
1   1 johnny 
2   1 joey 
3   3 deedee 

Все решения для отображения данных, которые я видел, не работают, потому что мой список не заполнен.

ответ

3

Мы можем использовать stack от base R после установки names «foo» в качестве последовательности «foo».

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

Вот один из способов с основанием 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 

Как отметил @RichardScriven в комментариях, sapply(foo, length) можно заменить lengths(foo).

7

melt функция пакета reshape2 также работает над списками. Таким образом, вы можете использовать:

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

Я считаю, что вы знаете, как изменить имена впоследствии.

0

Это работает с данным примером:

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 ультра крутой (system.time 1,74 для списка 10k) и unlist решения @jbaums' так же быстро, когда используется lengths (1.72), но выигрыш в решении stack @ akrun заставляет его так смехотворно быстро (0.06). Как и ожидалось, цикл является самым медленным (21.86).

Смежные вопросы