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.
Hadley, e quindi il hadleyverse, in realtà non approva rownames, quindi è improbabile che si otterrà uno qualsiasi di questi pacchetti per preservare rownames. – Thomas
Usando 'data.table' potresti forse fare' rbindlist (lapply (l, setDT, keep.rownames = TRUE)) 'sebbene non sia sicuro riguardo all'efficienza. –
Usa 'dplyr :: add_rownames()' –