2016-07-13 43 views
6

Ecco un piccolo elenco:elenco incompleto in dataframe

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

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

[[2]] 
character(0) 

[[3]] 
[1] "deedee" 

Come posso trasformarlo in questa cornice di dati?

list_item name 
1   1 johnny 
2   1 joey 
3   3 deedee 

Tutte le soluzioni elenco-dati-frame che ho visto non funzionano perché la mia lista è incompleta.

risposta

3

Possiamo utilizzare stack da base R dopo aver impostato il names di "pippo" come sequenza di "pippo".

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

Ecco un modo con base 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 

Come menzionato da @RichardScriven nei commenti, sapply(foo, length) possono essere sostituiti con lengths(foo).

7

La funzione melt del pacchetto reshape2 funziona anche negli elenchi. Quindi puoi usare:

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

Credo che tu sappia come cambiare i nomi in seguito.

0

Questo funziona con l'esempio dato:

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 è ultra cool (system.time 1.74 per una lista di 10k) e la soluzione @jbaums' unlist è altrettanto veloce quando si utilizza lengths (1,72), ma la soluzione di @ akrun stack vince perché è così incredibilmente veloce (0,06). Come previsto, il ciclo è più lento (21,86).

Problemi correlati