2015-03-11 1 views
1

J'ai actuellement un problème en combinant un grand nombre de données dans des données de panel. J'ai trouvé cette solution qui m'aide pour les solutions "plus petites": Panel Data mais je ne peux pas l'appliquer à un "plus grand" format.Création de données de panel avec beaucoup de données dans R

Je vais essayer de faire un exemple de codage: A partir du paquet « ensembles de données »:

df_1 = WorldPhones # In my case, years 2000-2014 and 43 columns (districts) 
df_2 = WorldPhones # In my case, there is different data here 
df_3 = WorldPhones # "" 
df_4 = WorldPhones # "" 

Chaque trame de données contient des valeurs différentes pour chacun des 43 districts. J'ai donné à chaque district un identifiant unique (1 à 43). Les 43 districts sont comparables aux 7 régions (continents) données dans l'ensemble de données WorldPhones. Chaque dataframe contient seulement une variable pour chaque district et chaque année. Disons que df_1 contient la variable X1, df_2 contient X2 et ainsi de suite. Je veux obtenir ces données dans le « long » format somethink comme ceci:

Id Year X1  X2 X3 ... 
1 1951 45939 21574 2876 
1 1956 60423 29990 4708 
1 1957 64721 32510 5230 
1 1958 68484 35218 6662 
1 1959 71799 37598 6856 
1 1960 76036 40341 8220 
1 1961 79831 43173 9053 
2 1951 45939 21574 2876 
2 1956 60423 29990 4708 
2 1957 64721 32510 5230 
2 1958 68484 35218 6662 
2 1959 71799 37598 6856 
2 1960 76036 40341 8220 
2 1961 79831 43173 9053 
... 
43 1951 45939 21574 2876 
43 1956 60423 29990 4708 
43 1957 64721 32510 5230 
43 1958 68484 35218 6662 
43 1959 71799 37598 6856 
43 1960 76036 40341 8220 
43 1961 79831 43173 9053 

Malheureusement, je ne sais vraiment pas comment faire, à l'exception de « force brute », qui serait d'écrire « il vers le bas "43 fois.

Répondre

2

Assez facile en utilisant soit tidyr ou reshape2. À mon humble avis, chaque utilisateur R devrait apprendre à utiliser ces 2 paquets avec data.table, dplyr.

library("datasets") 
library(reshape2) 
library(dplyr) 
WorldPhones <- data.frame(WorldPhones) # matrix format to data.frame 
WorldPhones$Year <- rownames(WorldPhones) # create Year column 
df_1 <- df_2 <- df_3 <- WorldPhones  # 
# transform to long format using melt from reshape2 
df_1 <- melt(df_1, id.vars = "Year", variable.name = "Id", value.name="X")  
df_2 <- df_3 <- df_1      # similarly for df_2, df_3. 
# merge the datasets using left_join from dplyr 
df_1 %>% 
    left_join(df_2, by=c("Year", "Id")) %>% 
    left_join(df_3, by=c("Year", "Id")) %>% head 
    Year  Id X.x X.y  X 
1 1951 N.Amer 45939 45939 45939 
2 1956 N.Amer 60423 60423 60423 
3 1957 N.Amer 64721 64721 64721 
4 1958 N.Amer 68484 68484 68484 
5 1959 N.Amer 71799 71799 71799 
6 1960 N.Amer 76036 76036 76036 

Ou en utilisant data.table

library("data.table") 
dt_1 <- setDT(WorldPhones) 
dt_1 <- melt(dt_1, id.vars = "Year", variable.name = "Id", value.name="X") 
setkey(dt_1, Year, Id) 
dt_2 <- dt_3 <- dt_1 
dt_1[dt_2][dt_3]   
    Year  Id  X i.X i.X.1 
1: 1951 N.Amer 45939 45939 45939 
2: 1951 Europe 21574 21574 21574 
3: 1951  Asia 2876 2876 2876 
4: 1951 S.Amer 1815 1815 1815 
5: 1951 Oceania 1646 1646 1646 
+0

Impressionnant! Merci! J'ai utilisé votre première suggestion avec dplyr et reshape2. :) –

+0

Connaissez-vous également une astuce simple pour copier les mêmes données (seulement 1 colonne) dans toutes les régions (districts)? Dans ce cas, les données sont égales dans toutes les régions. –

+0

Pouvez-vous élaborer? – ExperimenteR