2010-11-16 21 views
5

J'ai vu quelques questions sur la fusion de fichiers CSV dans une trame de données. Que faire si les trames de données sont déjà dans l'espace de travail. J'ai cinq grands zoos que je lance en tant que cadres de données, puis fondre. Voici la tête d'un:Fusionner plusieurs trames de données sur deux colonnes communes

> head(df.mon.ssf.ret) 
     date variable value 
1 2009.000  AA1C NA 
2 2009.083  AA1C NA 
3 2009.167  AA1C NA 
4 2009.250  AA1C NA 
5 2009.333  AA1C NA 
6 2009.417  AA1C NA 

je pouvais fusionner ces derniers sur « date » et « variable » avec une série de fusions imbriquées, mais qui semble maladroite. Y a-t-il une manière plus programmatique de fusionner?

Si je suis convaincu que les colonnes sont dans le même ordre dans tous les zoos, puis-je être sûr que la fusion maintient cette commande et utilise cbind? Merci!

Mise à jour:

Il y a quelque chose qui me manque sur la philosophie d'utilisation de la fonte. Voici ce qui se passe quand je fusionner comme un zoo et faire fondre comme trame de données très large en utilisant trois des zoos:

> temp <- merge(z.ssf.oi, z.ssf.oig, z.ssf.ret) 
> class(temp) 
[1] "zoo" 
> temp2 <- cbind(index(temp), as.data.frame(temp)) 
> class(temp2) 
[1] "data.frame" 
> names(temp2)[1] <- "date" 
> dim(temp2) 
[1] 12 1204 
> temp3 <- melt(temp2, id="date") 
Error in data.frame(ids, variable, value) : 
    arguments imply differing number of rows: 12, 14436 
> head(temp2)[, 1:5] 
      date AA1C.z.ssf.oi AAPL1C.z.ssf.oi ABT1C.z.ssf.oi ABX1C.z.ssf.oi 
Jan 2009 Jan 2009  1895.800  49191.25    NA    NA 
Feb 2009 Feb 2009  1415.579  42650.26    NA  6267.96 
Mar 2009 Mar 2009  1501.398  36712.20    NA  11581.65 
Apr 2009 Apr 2009  1752.936  74376.27    NA  12168.29 
May 2009 May 2009  1942.874  96307.30    NA  13490.60 
Jun 2009 Jun 2009   NA  79170.70    NA  16337.21 

Mise à jour 2: Merci pour l'aide! Voici une solution très manuel

> A <- cbind(index(z.ssf.oi), as.data.frame(z.ssf.oi)) 
> names(A)[1] <- "date" 
> B <- cbind(index(z.ssf.oig), as.data.frame(z.ssf.oig)) 
> names(B)[1] <- "date" 
> C <- cbind(index(z.ssf.ret), as.data.frame(z.ssf.ret)) 
> names(C)[1] <- "date" 
> A.melt <- melt(A, id="date") 
> head(A.melt) 
     date variable value 
1 Jan 2009  A1C NA 
2 Feb 2009  A1C NA 
3 Mar 2009  A1C NA 
4 Apr 2009  A1C NA 
5 May 2009  A1C NA 
6 Jun 2009  A1C NA 
> B.melt <- melt(B, id="date") 
> C.melt <- melt(C, id="date") 
> ans <- merge(merge(A.melt, B.melt, by=c("date", "variable")), C.melt, by=c("date", "variable")) 
> names(ans)[3:5] <- c("oi", "oig", "ret") 
> head(ans) 
     date variable  oi  oig   ret 
1 Apr 2009  A1C  NA  NA   NA 
2 Apr 2009  AA1C  NA  NA   NA 
3 Apr 2009 AAPL1C 59316.88 0.3375786 0.008600073 
4 Apr 2009 ABB1C  NA  NA   NA 
5 Apr 2009 ABT1C  NA  NA   NA 
6 Apr 2009 ABX1C  NA  NA   NA 

(et les agences nationales sont d'un ensemble de données incomplètes à la maison et qui ont besoin du cadran dans le filtrage de ma base de données)

Mise à jour 3: Voici quelques dputs (je pris la [ 1:10, 1:10] sous-ensemble de chaque grand zoo et converti en images)

> dput(A) 
structure(list(group = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L), class = "factor", .Label = "oi"), date = structure(c(2009, 
2009.08333333333, 2009.16666666667, 2009.25, 2009.33333333333, 
2009.41666666667, 2009.5, 2009.58333333333, 2009.66666666667, 
2009.75), class = "yearmon"), AA1C = c(NA_real_, NA_real_, NA_real_, 
NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_ 
), AAPL1C = c(49226.391, 42662.1589473684, 35354.4254545455, 
57161.6495238095, 84362.895, NA, NA, 47011.8519047619, 57852.2171428571, 
33058.0090909091), ABT1C = c(NA_real_, NA_real_, NA_real_, NA_real_, 
NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_), 
    ABX1C = c(NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, 
    NA_real_, NA_real_, NA_real_, NA_real_, NA_real_), ACE1C = c(NA_real_, 
    NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, 
    NA_real_, NA_real_, NA_real_), ACI1C = c(NA_real_, NA_real_, 
    NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, 
    NA_real_, NA_real_), ACS1C = c(NA_real_, NA_real_, NA_real_, 
    NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, 
    NA_real_), ADBE1C = c(NA_real_, NA_real_, NA_real_, NA_real_, 
    NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_ 
    ), ADCT1C = c(NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, 
    NA_real_, NA_real_, NA_real_, NA_real_, NA_real_), ADI1C = c(NA_real_, 
    NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, 
    NA_real_, NA_real_, NA_real_)), .Names = c("group", "date", 
"AA1C", "AAPL1C", "ABT1C", "ABX1C", "ACE1C", "ACI1C", "ACS1C", 
"ADBE1C", "ADCT1C", "ADI1C"), row.names = c("Jan 2009", "Feb 2009", 
"Mar 2009", "Apr 2009", "May 2009", "Jun 2009", "Jul 2009", "Aug 2009", 
"Sep 2009", "Oct 2009"), class = "data.frame") 
> dput(B) 
structure(list(group = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L), class = "factor", .Label = "oig"), date = structure(c(2009.08333333333, 
2009.16666666667, 2009.25, 2009.33333333333, 2009.41666666667, 
2009.5, 2009.58333333333, 2009.66666666667, 2009.75, 2009.83333333333 
), class = "yearmon"), AA1C = c(NA_real_, NA_real_, NA_real_, 
NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_ 
), AAPL1C = c(-0.143117562125788, -0.187888745830302, 0.480459636485712, 
0.389244461579155, NA, NA, NA, 0.207492040517069, -0.559627909130612, 
NA), ABT1C = c(NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, 
NA_real_, NA_real_, NA_real_, NA_real_, NA_real_), ABX1C = c(NA_real_, 
NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, 
NA_real_, NA_real_), ACE1C = c(NA_real_, NA_real_, NA_real_, 
NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_ 
), ACI1C = c(NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, 
NA_real_, NA_real_, NA_real_, NA_real_, NA_real_), ACS1C = c(NA_real_, 
NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, 
NA_real_, NA_real_), ADBE1C = c(NA_real_, NA_real_, NA_real_, 
NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_ 
), ADCT1C = c(NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, 
NA_real_, NA_real_, NA_real_, NA_real_, NA_real_), ADI1C = c(NA_real_, 
NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, 
NA_real_, NA_real_)), .Names = c("group", "date", "AA1C", "AAPL1C", 
"ABT1C", "ABX1C", "ACE1C", "ACI1C", "ACS1C", "ADBE1C", "ADCT1C", 
"ADI1C"), row.names = c("Feb 2009", "Mar 2009", "Apr 2009", "May 2009", 
"Jun 2009", "Jul 2009", "Aug 2009", "Sep 2009", "Oct 2009", "Nov 2009" 
), class = "data.frame") 
> dput(C) 
structure(list(group = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L), class = "factor", .Label = "ret"), date = structure(c(2009, 
2009.08333333333, 2009.16666666667, 2009.25, 2009.33333333333, 
2009.41666666667, 2009.5, 2009.58333333333, 2009.66666666667, 
2009.75), class = "yearmon"), AA1C = c(NA_real_, NA_real_, NA_real_, 
NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_ 
), AAPL1C = c(-0.143117562125788, -0.187888745830302, 0.480459636485712, 
0.389244461579155, NA, NA, NA, 0.207492040517069, -0.559627909130612, 
NA), ABT1C = c(NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, 
NA_real_, NA_real_, NA_real_, NA_real_, NA_real_), ABX1C = c(NA_real_, 
NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, 
NA_real_, NA_real_), ACE1C = c(NA_real_, NA_real_, NA_real_, 
NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_ 
), ACI1C = c(NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, 
NA_real_, NA_real_, NA_real_, NA_real_, NA_real_), ACS1C = c(NA_real_, 
NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, 
NA_real_, NA_real_), ADBE1C = c(NA_real_, NA_real_, NA_real_, 
NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_ 
), ADCT1C = c(NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, 
NA_real_, NA_real_, NA_real_, NA_real_, NA_real_), ADI1C = c(NA_real_, 
NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, 
NA_real_, NA_real_)), .Names = c("group", "date", "AA1C", "AAPL1C", 
"ABT1C", "ABX1C", "ACE1C", "ACI1C", "ACS1C", "ADBE1C", "ADCT1C", 
"ADI1C"), row.names = c("Feb 2009", "Mar 2009", "Apr 2009", "May 2009", 
"Jun 2009", "Jul 2009", "Aug 2009", "Sep 2009", "Oct 2009", "Nov 2009" 
), class = "data.frame") 
+2

Pouvez-vous fusionner les objets de zoo large en premier ('merge.zoo' accepte plus de deux objets), puis remodeler? –

+1

Pourriez-vous donner un exemple de ce à quoi vous voudriez que les données ressemblent après avoir terminé l'opération de recomposition/fusion? –

Répondre

6

Vous pouvez essayer ceci. Non testé puisque votre exemple n'est pas reproductible. Donnez-nous des données factices pour z.sfff.oi, z.sff.oig et z.sff.ret si vous voulez une meilleure réponse. Vous pouvez utiliser dput() pour générer du code pour un ensemble de données reproductible.

A <- data.frame(Group = "oi", date = as.factor(index(z.ssf.oi),) as.data.frame(z.ssf.oi))) 
B <- data.frame(Group = "oig", date = as.factor(index(z.ssf.oig)), as.data.frame(z.ssf.oig))) 
C <- data.frame(Group = "ret", date = as.factor(index(z.ssf.ret)), as.data.frame(z.ssf.ret))) 
Long <- melt(rbind(A, B, C), id.vars = c("Group", "date"))) 
cast(date ~ Group, data = Long) 
+0

Merci! Je dois commencer à penser comme ça! Je reçois toujours le même avertissement (je vais faire un petit sous-ensemble ci-dessus pour bricoler): 'Erreur dans data.frame (ids, variable, valeur): les arguments impliquent un nombre différent de lignes: 30, 300' –

+0

Je devrais ajouter, le appel pour obtenir cette erreur est 'long <- fondre (temp, id.vars = c (" groupe "," date "))' où temp est le rbind des trois trames de données. –

+0

Vous avez une idée, c'est vrai! Après un peu plus de bricolage, le problème est la classe yearmon que je reçois d'index(). Donc j'ai enveloppé ça dans as.factor() et ça marche à merveille! Merci pour l'aide! S'il vous plaît as.factor() ou as.character() à votre solution ci-dessus pour la postérité. –