2010-11-19 35 views
4

J'ai deux trames de données. L'un se compose de trois variables, à savoir « date », « grève » et « vol » avec 20 observations par jour, 100 par mois et 1200 par an (en jours de bourse), qui ressemble à ceFusion de deux trames de données différentes dans R

Date   Price  Vol 
2008-09-01 20   0.2 
2008-09-01 30   0.5 
... 

Donc, pour chaque mois, j'ai certaines valeurs pour le prix et le volume, allant de 10 à 40, de 0,1 à 0,7, respectivement.
La seconde comprend des valeurs interpolées du premier. Je n'ai donc pas la date plus, cependant petites étapes pour les autres variables:

Price  Vol 
    20   0.2 
    21   0.21 
    22   0.24 
    30   0.5 

Ainsi, alors qu'un cadre indique les valeurs dans un temps discret, l'autre est plus ou moins de la nature continue.
Maintenant, ma question: comment est-il possible de dire à R de fusionner la deuxième trame de données dans la première, en reprenant les dates pour les prix/volumes continus entre les deux discrètes, pour arriver à quelque chose comme:

Date   Price  Vol 
2008-09-01 20   0.2 
2008-09-01 21   0.21 
2008-09-01 22   0.24 
... 
2008-09-01 30   0.5 

Je n'arrive juste pas à comprendre comment le faire. J'ai toujours fini avec des valeurs NA pour les dates qui ne sont plus dans l'ordre croissant.

Merci beaucoup pour votre soutien
Dani

+0

Veuillez ajouter le code qui donne le résultat non désiré et donnez-nous la structure de vos données. Date de la classe POSIXlt, Data, chron, character, ...? par exemple. –

Répondre

2

Je suis totalement Maladroit avec le premier poste. Celui-ci fait la date. Mais je suis d'accord avec Shane que si une fonction en aval nécessite des trames de données, alors une série chronologique est une bonne idée.

A <- data.frame(date=rep("2001-05-25", 2), price=c(20, 30), vol=c(0.2, 0.5)) 
B <- data.frame(price=seq(min(A$price), max(A$price), by=1)) 
C <- merge(A, B, all=TRUE) 
index <- which(!is.na(C$vol)) 
for (i in seq(nrow(A))[-1]) { 
    C$date[index[i-1]:index[i]] <- rep(A$date[i-1], A$price[i] - A$price[i-1] + 1) 
    C$vol[index[i-1]:index[i]] <- seq(A$vol[i-1], A$vol[i], length=(A$price[i] - A$price[i-1] + 1)) 
} 
ans <- C[, c(2, 1, 3)] 

ans 
     date price vol 
1 2001-05-25 20 0.20 
2 2001-05-25 21 0.23 
3 2001-05-25 22 0.26 
4 2001-05-25 23 0.29 
5 2001-05-25 24 0.32 
6 2001-05-25 25 0.35 
7 2001-05-25 26 0.38 
8 2001-05-25 27 0.41 
9 2001-05-25 28 0.44 
10 2001-05-25 29 0.47 
11 2001-05-25 30 0.50 
4

Tout d'abord, utilisez une classe de séries temporelles (par exemple zoo ou xts). Votre seconde série chronologique interpolée doit toujours avoir un horodatage, même s'il s'agit d'une heure ou d'une minute, etc. Utilisez merge pour les rapprocher, puis utilisez na.locf pour reporter les valeurs de la série chronologique basse fréquence.

Voici un exemple:

ts1 <- zoo(1:5, as.POSIXct(as.Date("2010-10-01") + 1:5)) 
ts2 <- zoo(1:(5 * 24), as.POSIXct("2010-10-01 00:00:00") + (1:(5 * 24) * 3600)) 
na.locf(merge(ts1, ts2)) 
+1

J'ai peur que ce soit la bonne solution à la mauvaise question. Vous n'avez même pas besoin de séries chronologiques. Voir Date comme facteur dont les niveaux doivent se répartir sur la seconde trame de données, à partir des valeurs de la première trame de données. Trop paresseux pour chercher la solution, mais il a déjà été résolu ici. –

+2

@Joris Il me manque peut-être quelque chose, mais je pense que mon exemple fait ce qu'il veut. Et oui, une série chronologique n'est pas nécessaire, mais c'est utile. – Shane

+1

Votre point de départ est incorrect. ts1 devrait ressembler à zoo (seq (1, by = 24, longueur.out = 5), as.POSIXct (as.Date ("2010-10-01") + 1: 5)). Et puis vous devriez obtenir un dataframe où vous avez répété 24 fois les dates dans ts1, mais avec les valeurs de ts2. Au moins c'est ce que j'en ai fait. –