2016-02-24 9 views
5

Ho diversi frame di dati nel modulo dati del pannello. Ora voglio unire questi frame di dati del pannello in un pannello dati. Questi frame di dati sono comuni e diversi tra loro. Illustriamo come segue:Unisci i dati del pannello per ottenere dati di pannello bilanciati

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 

L'uscita desiderata è come segue, voglio unire i frame di dati del pannello in modo tale che ciascuna variabile sistemato in modo cronico e se i dati non sono in grado di un anno, allora ha NA sotto Beta1, Beta2 e così via.

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 

Come ho detto prima che mi diversi frame di dati e la loro unione sarebbe probabilmente derivato in centinaia di migliaia di file, così ho ho potuto affrontare i problemi di memoria e di spazio. Apprezzerei molto il tuo aiuto.

risposta

5

C'è una funzione per questo. Combina i frame di dati con rbind. Quindi utilizzare complete. Si farà il punto attraverso i gruppi in variable e riempire qualsiasi con valori mancanti:

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 
# ..  ...  ... ... ... ... ... ... ... 

Un'implementazione alternativa con dplyr & tidyr:

library(dplyr) 
library(tidyr) 

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

Quando ho eseguito questa parte di codice 'newdf <- completa (df3, mese, variabile)' Ricevo errore 'Errore: non posso partecipare alle colonne 'Mese' x 'Mese': Impossibile partecipare a 'Mese' x 'Mese' a causa di tipi incompatibili (yearmon/yearmon) '. 'Completa anche parte del pacchetto tidyr? –

+0

Il formato della data ti perseguita di nuovo. Aggiungi questa riga tra gli altri due 'df3 [, 1] <- as.character (df3 [, 1])' –

+0

Sembra un po 'ridondante usare 'do.call (rbind, list (...))' vs just 'rbind' –

4

due possibilità alternative, di cui in particolare il data.table altenative (s) sono di interesse quando velocità e memoria sono un problema:

Base R:

Bind le dataframes insieme in uno:

df3 <- rbind(df1,df2) 

Creare un dataframe riferimento con tutte le possibili combinazioni di Month e variable con expand.grid:

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

fonderli insieme all.x=TRUE quindi assicurati che le combinazioni mancanti siano piene di valori NA:

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

O (grazie a @PierreLafortune):

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

data.table:

Bind i dataframes in uno con 'rbindlist' che restituisce un 'dati.tavolo ':

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

Registrato con un riferimento a garantire tutte le combinazioni sono presenti e quelli mancanti sono riempiti con NA:

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

Tutto stessa chiamata:

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

Un'alternativa è il wrappingin setkey e quindi si espande con CJ (cross join):

+0

Ho base R e funziona bene solo la cosa è che se si nota nell'illustrazione finale i dati sono ordinati in modo tale che co. A ha i primi valori per l'anno 2005 e 2006 e poi co. B per l'anno 2005 e 2006. Ma quando lo ordino ottengo i valori per l'anno 2005 per A e poi per il 2005 per B. –