2016-02-24 33 views
5

Mam kilka ramek danych w formie danych panelu. Teraz chcę scalić te panele danych panelu w jeden panel danych. Te ramki danych są wspólne i różne między nimi. I przedstawiono w następujący sposób:Scal dane panelu, aby uzyskać zbalansowane dane panelu

DF1:

Month variable Beta1 Beta2 Beta3 Beta4 Beta5 Beta6 
Jan-05  A  1  2  3  4  5  6 
Feb-05  A  2  3  4  5  6  7 
Mar-05  A  3  4  5  6  7  8 
Apr-05  A  4  5  6  7  8  9 
May-05  A  5  6  7  8  9  10 
Jun-05  A  6  7  8  9  10  11 
Jul-05  A  7  8  9  10  11  12 
Aug-05  A  8  9  10  11  12  13 
Sep-05  A  9  10  11  12  13  14 
Oct-05  A  10  11  12  13  14  15 
Nov-05  A  11  12  13  14  15  16 
Dec-05  A  12  13  14  15  16  17 
Jan-05  B  12  12  12  12  12  12 
Feb-05  B  12  12  12  12  12  12 
Mar-05  B  12  12  12  12  12  12 
Apr-05  B  12  12  12  12  12  12 
May-05  B  12  12  12  12  12  12 
Jun-05  B  12  12  12  12  12  12 
Jul-05  B  12  12  12  12  12  12 
Aug-05  B  12  12  12  12  12  12 
Sep-05  B  12  12  12  12  12  12 
Oct-05  B  12  12  12  12  12  12 
Nov-05  B  12  12  12  12  12  12 
Dec-05  B  12  12  12  12  12  12 

df2:

Month variable Beta1 Beta2 Beta3 Beta4 Beta5 Beta6 
Jan-06  A  1  2  3  4  5  6 
Feb-06  A  2  3  4  5  6  7 
Mar-06  A  3  4  5  6  7  8 
Apr-06  A  4  5  6  7  8  9 
May-06  A  5  6  7  8  9  10 
Jun-06  A  6  7  8  9  10  11 
Jul-06  A  7  8  9  10  11  12 
Aug-06  A  8  9  10  11  12  13 
Sep-06  A  9  10  11  12  13  14 
Oct-06  A  10  11  12  13  14  15 
Nov-06  A  11  12  13  14  15  16 
Dec-06  A  12  13  14  15  16  17 
Jan-06  C  12  12  12  12  12  12 
Feb-06  C  12  12  12  12  12  12 
Mar-06  C  12  12  12  12  12  12 
Apr-06  C  12  12  12  12  12  12 
May-06  C  12  12  12  12  12  12 
Jun-06  C  12  12  12  12  12  12 
Jul-06  C  12  12  12  12  12  12 
Aug-06  C  12  12  12  12  12  12 
Sep-06  C  12  12  12  12  12  12 
Oct-05  C  12  12  12  12  12  12 
Nov-05  C  12  12  12  12  12  12 
Dec-05  C  12  12  12  12  12  12 

żądana jest w następujący sposób: I scalić ramek danych panelu tak, że każda zmienna Ułożone w sposób chroniczny i jeśli dane nie są dostępne przez rok, to mają NA w ramach Beta1, Beta2 i tak dalej.

Month variable Beta1 Beta2 Beta3 Beta4 Beta5 Beta6 
Jan-05 A   1 2  3  4  5  6 
Feb-05 A   2 3  4  5  6  7 
Mar-05 A   3 4  5  6  7  8 
Apr-05 A   4 5  6  7  8  9 
May-05 A   5 6  7  8  9  10 
Jun-05 A   6 7  8  9  10  11 
Jul-05 A   7 8  9  10  11  12 
Aug-05 A   8 9  10  11  12  13 
Sep-05 A   9 10  11  12  13  14 
Oct-05 A   10 11  12  13  14  15 
Nov-05 A   11 12  13  14  15  16 
Dec-05 A   12 13  14  15  16  17 
Jan-06 A   1 2  3  4  5  6 
Feb-06 A   2 3  4  5  6  7 
Mar-06 A   3 4  5  6  7  8 
Apr-06 A   4 5  6  7  8  9 
May-06 A   5 6  7  8  9  10 
Jun-06 A   6 7  8  9  10 11 
Jul-06 A   7 8  9  10  11 12 
Aug-06 A   8 9  10  11  12 13 
Sep-06 A   9 10  11  12  13 14 
Oct-06 A   10 11  12  13  14 15 
Nov-06 A   11 12  13  14  15 16 
Dec-06 A   12 13  14  15  16 17 
Jan-05 B   12 12  12  12  12 12 
Feb-05 B   12 12  12  12  12 12 
Mar-05 B   12 12  12  12  12 12 
Apr-05 B   12 12  12  12  12 12 
May-05 B   12 12  12  12  12 12 
Jun-05 B   12 12  12  12  12 12 
Jul-05 B   12 12  12  12  12 12 
Aug-05 B   12 12  12  12  12 12 
Sep-05 B   12 12  12  12  12 12 
Oct-05 B   12 12  12  12  12 12 
Nov-05 B   12 12  12  12  12 12 
Dec-05 B   12 12  12  12  12 12 
Jan-06 B   NA NA  NA  NA  NA NA 
Feb-06 B   NA NA  NA  NA  NA NA 
Mar-06 B   NA NA  NA  NA  NA NA 
Apr-06 B   NA NA  NA  NA  NA NA 
May-06 B   NA NA  NA  NA  NA NA 
Jun-06 B   NA NA  NA  NA  NA NA 
Jul-06 B   NA NA  NA  NA  NA NA 
Aug-06 B   NA NA  NA  NA  NA NA 
Sep-06 B   NA NA  NA  NA  NA NA 
Oct-06 B   NA NA  NA  NA  NA NA 
Nov-06 B   NA NA  NA  NA  NA NA 
Dec-06 B   NA NA  NA  NA  NA NA 
Jan-05 C   NA NA  NA  NA  NA NA 
Feb-05 C   NA NA  NA  NA  NA NA 
Mar-05 C   NA NA  NA  NA  NA NA 
Apr-05 C   NA NA  NA  NA  NA NA 
May-05 C   NA NA  NA  NA  NA NA 
Jun-05 C   NA NA  NA  NA  NA NA 
Jul-05 C   NA NA  NA  NA  NA NA 
Aug-05 C   NA NA  NA  NA  NA NA 
Sep-05 C   NA NA  NA  NA  NA NA 
Oct-05 C   NA NA  NA  NA  NA NA 
Nov-05 C   NA NA  NA  NA  NA NA 
Dec-05 C   NA NA  NA  NA  NA NA 
Jan-06 C   12 12  12  12  12 12 
Feb-06 C   12 12  12  12  12 12 
Mar-06 C   12 12  12  12  12 12 
Apr-06 C   12 12  12  12  12 12 
May-06 C   12 12  12  12  12 12 
Jun-06 C   12 12  12  12  12 12 
Jul-06 C   12 12  12  12  12 12 
Aug-06 C   12 12  12  12  12 12 
Sep-06 C   12 12  12  12  12 12 
Oct-06 C   12 12  12  12  12 12 
Nov-06 C   12 12  12  12  12 12 
Dec-06 C   12 12  12  12  12 12 

Jak już wspomniano wcześniej, że kilka ramek danych i ich łączenie prawdopodobnie skutkować sto tysięcy wierszy, więc mogę zająć się problemów z pamięcią i przestrzenią. Będę naprawdę wdzięczny za pomoc.

Odpowiedz

5

Jest na to funkcja. Połącz ramki danych z rbind. Następnie użyj complete. Będzie to wyglądało za pośrednictwem grup w variable i wypełnić każdy z brakujących wartości:

library(tidyr) 
df3 <- do.call(rbind.data.frame, list(df1, df2)) 
df3$Month <- as.character(df3$Month) 
df4 <- complete(df3, Month, variable) 
df4$Month <- as.yearmon(df4$Month, "%b %Y") 
df5 <- df4[order(df4$variable,df4$Month),] 
df5 
# Source: local data frame [72 x 8] 
# 
#  Month variable Beta1 Beta2 Beta3 Beta4 Beta5 Beta6 
#  (yrmn) (fctr) (int) (int) (int) (int) (int) (int) 
# 1 Jan 2005  A  1  2  3  4  5  6 
# 2 Feb 2005  A  2  3  4  5  6  7 
# 3 Mar 2005  A  3  4  5  6  7  8 
# 4 Apr 2005  A  4  5  6  7  8  9 
# 5 May 2005  A  5  6  7  8  9 10 
# 6 Jun 2005  A  6  7  8  9 10 11 
# 7 Jul 2005  A  7  8  9 10 11 12 
# 8 Aug 2005  A  8  9 10 11 12 13 
# 9 Sep 2005  A  9 10 11 12 13 14 
# 10 Oct 2005  A 10 11 12 13 14 15 
# ..  ...  ... ... ... ... ... ... ... 

Alternatywna realizacja z dplyr & tidyr:

library(dplyr) 
library(tidyr) 

df3 <- bind_rows(df1, df2) %>% 
    complete(Month, variable) 
+0

Po uruchomieniu tej części kodu 'newdf <- complete (df3, Month, variable)' pojawia się błąd 'Błąd: nie można dołączyć do kolumn 'Miesiąc' x 'Miesiąc': Nie można dołączyć na" Miesiąc " x "Miesiąc" z powodu niezgodnych typów (yearmon/yearmon) '. Czy 'complete' również jest częścią pakietu tidyr? –

+0

Format daty ponownie Cię nawiedza. Dodaj tę linię pomiędzy dwoma innymi 'df3 [, 1] <- as.character (df3 [, 1])' –

+0

Wydaje się, że jest trochę zbędnym używanie 'do.call (rbind, list (...))' vs tylko 'rbind' –

4

dwie alternatywne możliwości, z których szczególnie data.table Altenative (s) są interesujące, gdy prędkość i pamięć są problemem:

zasadę R:

Wiązanie z dataframes razem w jeden:

df3 <- rbind(df1,df2) 

Tworzenie dataframe odniesienia wszystkich możliwych kombinacji Month i variable z expand.grid:

ref <- expand.grid(Month = unique(df3$Month), variable = unique(df3$variable)) 

połączyć je ze sobą przy all.x=TRUE więc upewnij się, że brakujące kombinacje są wypełnione wartościami NA:

merge(ref, df3, by = c("Month", "variable"), all.x = TRUE) 

Albo (thanx do @PierreLafortune):

merge(ref, df3, by=1:2, all.x = TRUE) 

data.table:

Powiąż dataframes język jednego z 'rbindlist' „, która zwraca dane.tabela ':

library(data.table) 
DT <- rbindlist(list(df1,df2)) 

Dołącz z odniesieniem do zapewnienia wszystkie kombinacje są obecne i te brakujące wypełnione są na:

DT[CJ(Month, variable, unique = TRUE), on = c(Month="V1", variable="V2")] 

wszystko razem w jednej rozmowy:

DT <- rbindlist(list(df1,df2))[CJ(Month, variable, unique = TRUE), on = c(Month="V1", variable="V2")] 

Alternatywny jest opakowywanie rbindlist w setkey, a następnie rozwijanie za pomocą CJ (połączenie krzyżowe):

DT <- setkey(rbindlist(list(df1,df2)), Month, variable)[CJ(Month, variable, unique = TRUE)] 
+0

Mam bazę R i działa dobrze, tylko jeśli na ostatniej ilustracji można zauważyć, że dane są uporządkowane tak, że co. A ma pierwsze wartości na rok 2005 i 2006, a następnie co. B na rok 2005 i 2006. Ale kiedy go zamówię, otrzymam wartości dla roku 2005 dla A, a następnie dla 2005 dla B. –