2010-11-19 28 views
4

Ich habe zwei Datenrahmen. Die eine besteht aus drei Variablen, nämlich „Datum“, „Schlag“ und „Band“ mit 20 Beobachtungen am Tag, 100 pro Monat und 1200 pro Jahr (in Handelstag), die wie dieseZusammenführen von zwei verschiedenen Datenrahmen in R

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

sieht Also für jeden Monat habe ich bestimmte Werte für Preis und Volumen, von 10 bis 40, jeweils 0,1 bis 0,7.
Die zweite enthält interpolierte Werte von der ersten. Also habe ich mehr nicht das Datum, aber kleine Schritte für die anderen Variablen:

Price  Vol 
    20   0.2 
    21   0.21 
    22   0.24 
    30   0.5 

So, während ein Rahmenwerte in einer diskreten Zeit zeigt, ist der andere mehr oder weniger kontinuierlicher Natur.
Jetzt meine Frage: wie ist es möglich, R zu sagen, den zweiten Datenrahmen in den ersten zu verschmelzen und die Daten für die fortlaufenden Preise/Volumina zwischen den beiden diskreten zu übernehmen:

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 

Ich kann einfach nicht herausfinden, wie es geht. Ich habe immer NA-Werte für die Daten erhalten, die nicht mehr aufsteigend sind.

Vielen Dank für Ihre Unterstützung
Dani

+0

fügen Sie bitte den Code hinzu, der das nicht gewünschte Ergebnis gibt und geben Sie uns die Struktur Ihrer Daten. ist das Datum der Klasse POSIXlt, Daten, Chron, Zeichen, ...? beispielsweise. –

Antwort

2

ich völlig den Punkt mit den ersten Beitrag verpasst. Dieser macht das Datum. Aber ich stimme Shane zu, dass eine Zeitreihe eine gute Idee ist, wenn keine Downstream-Funktion Datenrahmen benötigt.

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

Zuerst eine Zeitreihe Klasse verwenden (z zoo oder xts).

Ihre zweite interpolierte Zeitreihe sollte immer noch einen Zeitstempel haben, auch wenn sie stündlich oder jede Minute usw. ist. Verwenden Sie merge, um sie zusammenzuführen, und verwenden Sie dann na.locf, um die Werte aus der niedrigeren Frequenzzeitreihe zu übertragen.

Hier ist ein Beispiel:

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

Ich fürchte, das ist die richtige Lösung für die falsche Frage. Sie brauchen nicht einmal Zeitreihen. Siehe Datum als einen Faktor, von dem die Ebenen ausgehend von den Werten des ersten Datenrahmens über den zweiten Datenrahmen verteilt werden müssen. Zu faul, nach der Lösung zu suchen, aber das ist hier schon gelöst worden. –

+2

@Joris Ich vermisse etwas, aber ich denke, dass mein Beispiel macht, was er will. Und ja, eine Zeitreihe ist nicht notwendig, aber es ist nützlich. – Shane

+1

Ihr Startpunkt ist nicht korrekt. ts1 sollte wie zoo aussehen (seq (1, by = 24, length.out = 5), as.POSIXct (as.Date ("2010-10-01") + 1: 5)). Und dann sollten Sie ein Datenframe bekommen, wo Sie die Daten in ts1 24 Mal wiederholt haben, aber mit den Werten von ts2. Zumindest habe ich das gemacht. –

Verwandte Themen