2017-09-01 5 views
0

je suivantes, les données qui se sont avérés d'une fonte de tableau croisé dynamique (...):Mise en forme as.Date qu'une fois par mois pour fusionner les tables

df1 

date  x y 
2012-04-28 ... ... 
2012-06-29 ... ... 
2012-08-31 ... ... 
2012-09-30 ... ... 

df2 

date  x y 
2012-04-20 ... ... 
2012-06-30 ... ... 
2012-08-30 ... ... 
2012-09-28 ... ... 

Comme vous pouvez le voir, je ne peux pas correspondre à la table à travers l'indice sur une base mensuelle. Cela créera des NA pour certaines lignes. Par conséquent, je pensais, je pourrais aller par le format de l'heure du mois seulement.

Les fonctions suivantes ont été appliquées:

df1$date <- as.Date(df1$date) 
df1 <- zoo(df1, df1$date) 
index(df1) = as.yearmon(index(df1),"%y-%m") 

Retours:

df1 

date    x y 
April 2012  ... ... 
June 2012  ... ... 
August 2012  ... ... 
September 2012 ... ... 

Cependant, le résultat final devrait être

df1 

date  x y 
2012-04 ... ... 
2012-06 ... ... 
2012-08 ... ... 
2012-09 ... ... 

Pouvez-vous me aider?

+0

Pourquoi avez-vous besoin de 'zoo' ici? des raisons spécifiques? – Aramis7d

+0

Pour être honnête, je suis un peu déconcertée par tous les différents forfaits disponibles. Je suis tombé sur une description qui montrait comment agréger les données quotidiennes aux données mensuelles avec zoo, ce qui était exactement ce dont j'avais besoin. – Fanny

+0

Y a-t-il une meilleure façon de le résoudre? – Fanny

Répondre

1

pourquoi ne pas utiliser simplement format fonction qui est déjà dans R.

df1$data <- format(as.Date(df1$date), "%Y-%m") 
+0

Est-il encore possible d'agréger des valeurs pour toutes les colonnes par mois? Maintenant j'ai un index qui ressemble '2012-04'' 2012-04' '2012-04'' 2012-06 '2012-08' et je voudrais agréger toutes les valeurs qui ont un indice égal (mois) . 'apply.monthly (df1, FUN = colSums)' ne fonctionne plus ici. – Fanny

+0

Je créerais deux colonnes, une avec l'année et une avec les mois. Cela rendra le travail plus facile. Je peux mettre en forme la colonne mois et agréger avec mois et année. Je peux même utiliser le nom du mois comme "Janvier, Février, ..." – TheRimalaya

2

Peut-être que vous pouvez vous inspirer de ce qui suit.

x <- as.Date("2012-04-20") 
format(x, format = "%Y-%m") 
[1] "2012-04" 
0

fusion

Si votre objectif est de créer deux objets de zoo et de les fusionner par année/mois, vous n'avez pas besoin de convertir la colonne de date en une colonne de caractères. Au lieu de cela, essayez ceci:

library(zoo) 

z1 <- read.zoo(df1, FUN = as.yearmon) 
z2 <- read.zoo(df2, FUN = as.yearmon) 
z <- merge(z1, z2) 

donnant:

> z 
     x.z1 y.z1 x.z2 y.z2 
Apr 2012 1 2 1 2 
Jun 2012 3 4 3 4 
Aug 2012 5 6 5 6 
Sep 2012 7 8 7 8 

total

Pour globale à l'aide mean par mois, essayez ceci:

by_month <- aggregate(z, cycle, mean) 

donnant les éléments suivants où l'indice montre le numéro du mois:

> by_month 
    x.z1 y.z1 x.z2 y.z2 
4 1 2 1 2 
6 3 4 3 4 
8 5 6 5 6 
9 7 8 7 8 

terrain

Nous pouvons maintenant tracer cela en utilisant:

plot(by_month, type = "h", xlab = "month") 

screenshot

Note: Nous supposons que l'entrée est:

Lines <- " 
date  x y 
2012-04-28 1 2 
2012-06-29 3 4 
2012-08-31 5 6 
2012-09-30 7 8" 
df1 <- df2 <- read.table(text = Lines, header = TRUE)