2015-06-30 37 views
7

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.

+1

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

+2

Używając 'data.table' mógłbyś zrobić' rbindlist (lapply (l, setDT, keep.rownames = TRUE)) 'chociaż nie jesteś pewien wydajności. –

+0

Użyj 'dplyr :: add_rownames()' –

Odpowiedz

10

Aby zachować rownames, można po prostu zrobić:

do.call(rbind, unname(l)) 

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

Albo jak podkreślone przez ustawienie rownames z l do NULL, może to być również wykonane przez:

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

Czasami życie jest takie proste. Dziękuję Ci. – Midnighter

+1

Byłeś prawie na miejscu! Przynajmniej znasz setNames i unname! –

1

czemu nie tylko użycie rbind:

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

Nie mogę użyć tego podejścia na moim prawdziwym przykładzie, ponieważ ustawiam pełną listę przez wektor, coś w rodzaju 'l [c (" A "," C ")]', ale obliczone z innych wartości, z kierunek. – Midnighter

+1

Rozumiem. Inne odpowiedzi będą więc bardziej pomocne. Zostawię tę odpowiedź tutaj, aby inni wiedzieli, czego szukasz. –

2

Możemy używać add_rownames z dplyr pakietu przed oprawa:

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

Dobrze jest wiedzieć o 'add_rownames', ale w moim przypadku nie służy mi ono również. – Midnighter

+0

@Midnighter co jeśli rownames nakładają się na a, b, c? – zx8754

+1

Wiem na pewno, że nie będą w moim scenariuszu, ale to jest oczywiście ważny punkt. – Midnighter