Wiem o podstawach łączenia listy ramek danych w jedną, tak jak been answered before. Jednak interesują mnie inteligentne sposoby utrzymywania nazw rzędów. Załóżmy, że mam listę ramek danych, które są dość równe i trzymam je w nazwanej liście.Połączyć listę ramek danych w jeden zachowujący rząd nazw
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)
Podczas korzystania do.call
nazwy listy są połączone z nazwami rzędu:
> rownames(do.call("rbind", l))
[1] "A.a" "A.b" "A.c" "B.d" "B.e" "B.f" "C.g" "C.h" "C.i"
Kiedy używać dowolnego rbind.fill
, bind_rows
lub rbindlist
Row nazwy są zastąpione przez szereg numerycznej
> rownames(rbind.fill(l))
> rownames(bind_rows(l))
> rownames(rbindlist(l))
[1] "1" "2" "3" "4" "5" "6" "7" "8" "9"
Po usunięciu nazw z listy do.call
produkuje żądane wyjście:
> names(l) = NULL
> rownames(do.call("rbind", l))
[1] "a" "b" "c" "d" "e" "f" "g" "h" "i"
Czy istnieje funkcja, której brakuje, która zapewnia lepszą kontrolę nad nazwami wierszy? Potrzebuję nazw dla innego kontekstu, więc ich usunięcie jest nieoptymalne.
Hadley, a tym samym hadleyverse, naprawdę nie pochwalam rownames, więc jest mało prawdopodobne, że dostaniesz żadnej z tych pakietów, aby zachować rownames. – Thomas
Używając 'data.table' mógłbyś zrobić' rbindlist (lapply (l, setDT, keep.rownames = TRUE)) 'chociaż nie jesteś pewien wydajności. –
Użyj 'dplyr :: add_rownames()' –