2015-06-30 21 views
7

Conosco le nozioni di base sulla combinazione di un elenco di frame di dati in uno come lo è been answered before. Tuttavia, sono interessato a modi intelligenti per mantenere i nomi delle righe. Supponiamo che io abbia una lista di frame di dati che sono abbastanza uguali e li tengo in una lista nominata.Combina un elenco di frame di dati in un nome di riga di conservazione

library(plyr) 
library(dplyr) 
library(data.table) 

a = data.frame(x=1:3, row.names = letters[1:3]) 
b = data.frame(x=4:6, row.names = letters[4:6]) 
c = data.frame(x=7:9, row.names = letters[7:9]) 

l = list(A=a, B=b, C=c) 

Quando uso do.call, i nomi degli elenchi sono combinati con i nomi di riga:

> rownames(do.call("rbind", l)) 
[1] "A.a" "A.b" "A.c" "B.d" "B.e" "B.f" "C.g" "C.h" "C.i" 

Quando uso qualsiasi rbind.fill, bind_rows o rbindlist fila nomi sono sostituiti da un intervallo numerico:

> rownames(rbind.fill(l)) 
> rownames(bind_rows(l)) 
> rownames(rbindlist(l)) 
[1] "1" "2" "3" "4" "5" "6" "7" "8" "9" 

Quando rimuovo i nomi dall'elenco, do.call produce l'output desiderato:

> names(l) = NULL 
> rownames(do.call("rbind", l)) 
[1] "a" "b" "c" "d" "e" "f" "g" "h" "i" 

Quindi c'è una funzione che mi manca che fornisce un controllo più preciso sui nomi delle righe? Ho bisogno dei nomi per un contesto diverso, quindi rimuoverli non è ottimale.

+1

Hadley, e quindi il hadleyverse, in realtà non approva rownames, quindi è improbabile che si otterrà uno qualsiasi di questi pacchetti per preservare rownames. – Thomas

+2

Usando 'data.table' potresti forse fare' rbindlist (lapply (l, setDT, keep.rownames = TRUE)) 'sebbene non sia sicuro riguardo all'efficienza. –

+0

Usa 'dplyr :: add_rownames()' –

risposta

10

Per conservare rownames, si può semplicemente fare:

do.call(rbind, unname(l)) 

# x 
#a 1 
#b 2 
#c 3 
#d 4 
#e 5 
#f 6 
#g 7 
#h 8 
#i 9 

O come si sottolineate impostando i rownames di l-NULL, questo può essere fatto anche da:

do.call(rbind, setNames(l, NULL)) 
+1

A volte la vita è così semplice. Grazie. – Midnighter

+1

Eri quasi arrivato! Almeno conosci setNames e unname! –

1

Perché non solo utilizzando rbind:

rbind(l$A, l$B, l$C) 
+0

Non posso usare questo approccio nel mio esempio reale perché sto sottostimando l'elenco completo con un vettore, qualcosa come 'l [c (" A "," C ")]', ma calcolato da altri valori, di corso. – Midnighter

+1

Capisco. Quindi le altre risposte saranno più utili. Lascerò questa risposta qui in modo che altre persone sappiano cosa stai cercando. –

2

Possiamo utilizzare add_rownames da dplyr pacchetto prima vincolante:

rbind_all(lapply(l, add_rownames)) 

# Source: local data frame [9 x 2] 
# 
# rowname x 
# 1  a 1 
# 2  b 2 
# 3  c 3 
# 4  d 4 
# 5  e 5 
# 6  f 6 
# 7  g 7 
# 8  h 8 
# 9  i 9 
+0

È bello sapere "add_rownames", ma nel mio caso non mi è utile. – Midnighter

+0

@Midnighter Cosa succede se i rownames si sovrappongono in a, b, ec? – zx8754

+1

So per certo che non lo faranno nel mio scenario ma è un punto valido, ovviamente. – Midnighter