2014-10-04 16 views
5

ho un elenco nidificato:R: Conversione lista annidata al dataframe e ottenere i nomi dei livelli di elenco als fattori

list1 <- list("A"=c(1,1,1), "B"=c(2,2,2), "C"=c(3,3,3)) 
list2 <- list("F1" = list1, "F2" = list1) 

e vorrei ottenere l'ultimo livello della lista (che contiene il vettore) come dataframe e vorrei ottenere i livelli della lista come fattori:

Level1 Level2 V1 V2 V3 
1  F1  A 1 1 1 
2  F1  B 2 2 2 
3  F1  C 3 3 3 
4  F2  A 1 1 1 
5  F2  B 2 2 2 
6  F2  C 3 3 3 

la prima parte è ben dato da:

data.frame(matrix(unlist(list2), ncol=3, byrow=T)) 

Tuttavia, non ho trovato un buon modo per ottenere anche i nomi a livello di elenco come fattori nello stesso dataframe. Qualche idea? :)

Modifica: La procedura dovrebbe funzionare fino a p dimensioni.

+0

't (rbind.data.frame (list2))' si avvicina - avete solo bisogno di creare variabili dai rownames – user20650

+0

Grazie! Il problema è che i nomi delle liste variano (sono valori dei parametri in una simulazione) quindi non posso semplicemente usare substr per eliminare i fattori. – jmb

risposta

4

melt da "reshape2" ha un metodo per list s. Forse può essere usato in questo caso. Qualcosa di simile a questo:

library(reshape2) 
dcast(cbind(
    coln = sequence(rapply(list2, length)), 
    melt(list2)), L1 + L2 ~ coln, 
    value.var = "value") 
# L1 L2 1 2 3 
# 1 F1 A 1 1 1 
# 2 F1 B 2 2 2 
# 3 F1 C 3 3 3 
# 4 F2 A 1 1 1 
# 5 F2 B 2 2 2 
# 6 F2 C 3 3 3 
+1

Questo è tutto! Grazie per il suggerimento al pacchetto reshape2. – jmb

2

È possibile escludere dall'elenco un solo livello, di convertire rownames alle colonne, e unire il tutto in un unico data.frame:

xx <- do.call(rbind,unlist(list2,recursive = FALSE)) 
cbind.data.frame(do.call(rbind,strsplit(rownames(xx),'.',fixed=TRUE)) 
       ,xx) 

     1 2 1 2 3 
F1.A F1 A 1 1 1 
F1.B F1 B 2 2 2 
F1.C F1 C 3 3 3 
F2.A F2 A 1 1 1 
F2.B F2 B 2 2 2 
F2.C F2 C 3 3 3 
+0

Grazie! Questa è una bella soluzione, tuttavia stavo cercando una procedura che funzioni per le dimensioni p (scusate se non sono specifico al riguardo) – jmb

2

Con la propria soluzione che fornisce i valori nelle colonne X1, X2 e già X3 , è possibile effettuare le seguenti operazioni per ottenere le prime due colonne Level1 e Level2 dai nomi dei due liste:

level1 <- as.factor(rep(names(list2), each = length(list1))) 
level2 <- as.factor(rep(names(list1), times = length(list2))) 
data.frame(Level1 = level1, Level2 = level2, matrix(unlist(list2), ncol=3, byrow=T)) 

che si tradurrà in questo:

Level1 Level2 X1 X2 X3 
1  F1  A 1 1 1 
2  F1  B 2 2 2 
3  F1  C 3 3 3 
4  F2  A 1 1 1 
5  F2  B 2 2 2 
6  F2  C 3 3 3 
+0

Grazie! Funziona molto bene, tuttavia, speravo in una procedura che funzionasse fino alle dimensioni p (scusate se non sono specifico al riguardo) – jmb

Problemi correlati