2010-03-06 19 views
22

Przykro mi, jeśli na to pytanie już udzielono odpowiedzi. Jest to również mój pierwszy raz na stackoverflow.Powtarzanie listy danych Data.frames w pojedynczej ramce danych

Mam pytanie początkowe R dotyczące list, ramek danych i merge() i/lub rbind().

Zacząłem z panelu, który wygląda tak

COUNTRY YEAR VAR 
A   1 
A   2 
B   1 
B   2 

Dla celów efektywności, stworzyłem listę, która składa się z jednej ramki danych dla każdego kraju i wykonano szereg obliczeń na każdym data.frame. Jednak nie mogę ponownie połączyć poszczególnych ramek danych w jedną dużą ramkę.

rbind() i merge() oba informują mnie, że dozwolona jest tylko wymiana elementów.

Czy ktoś może mi powiedzieć, co robię źle/i jak właściwie połączyć ramki danych?

Dziękuję

Odpowiedz

4

Nie może być lepszy sposób to zrobić, ale to wydaje się działać i to jest proste. (Mój kod ma cztery linie, dzięki czemu łatwiej jest zobaczyć kroki, te cztery mogą być łatwo łączone.)

# first re-create your data frame: 
A = matrix(ceiling(10*runif(8)), nrow=4) 
colnames(A) = c("country", "year_var") 
dfa = data.frame(A) 

# now re-create the list you made from the individual rows of the data frame: 
df1 = dfa[1,] 
df2 = dfa[2,] 
df3 = dfa[3,] 
df4 = dfa[4,] 
df_all = list(df1, df2, df3, df4) 

# to recreate your original data frame: 
x = unlist(df_all)   # from your list create a single 1D array 
A = matrix(x, nrow=4)  # dimension that array in accord w/ your original data frame 
colnames(A) = c("country", "year_var")  # put the column names back on 
dfa = data.frame(A)  # from the matrix, create your original data frame 
+0

dziękuję za skrypt. Działa to całkiem dobrze, moim jedynym zmartwieniem jest to, że nie aktualizuje się automatycznie, gdybym dodawał kraj. (chociaż przypuszczam, że za pomocą pętli for można to zrobić też) – CGN

33

Może chcesz zrobić coś takiego:

do.call("rbind", my.df.list)

+0

Niestety, to zwraca błąd (myślę, że nie wszystkie panele są zbalansowane?) Tak czy inaczej, powyższe polecenie zadziałało. Ale dziękuję. – CGN

+0

To rozwiązanie działa, ale działa wolno – Kots

3

plyr jest prawdopodobnie Najlepiej. Innym użytecznym podejściem, gdy ramki danych może być różna jest użycie Reshape:

library(reshape) 
data <- merge_recurse(listofdataframes) 

Spójrz na moją odpowiedź na this related question on merging data frames.

5

Należy pamiętać, że podstawowe rozwiązanie

do.call("rbind", my.df.list) 

będzie powolny, jeśli mamy wiele dataframes. Skalowalne rozwiązanie jest:

library(data.table) 
rbindlist(my.df.list) 

które z docs, jest same as do.call("rbind", l) on data.frames, but much faster.

5

dplyr pozwala używać bind_rows funkcję że:

library(dplyr) 

foo <- list(df1 = data.frame(x=c('a', 'b', 'c'),y = c(1,2,3)), 
     df2 = data.frame(x=c('d', 'e', 'f'),y = c(4,5,6))) 

bind_rows(foo) 
Powiązane problemy