2016-08-03 36 views
2

Ich habe den folgenden Datensatz.Füllung fehlende Werte Datetime-Serie Daten mit Interpolation in R

name - old - new - datetime  
1051  38656  38400  2016-01-24 03:22:37  
1051  5888  5632  2016-01-24 04:03:28 
1051  5632  38144  2016-01-24 04:34:22  
1051  5120  4864  2016-01-24 03:56:33 
1051  37376  37632  2016-01-25 08:08:16 
..  ..   ..   .. 

Ich möchte diesen Datensatz zu interpolieren:

name - old - new - datetime 
1051  ?   ?   2016-01-24 03:20:00 
1051  ?   ?   2016-01-24 03:30:00  
1051  ?   ?   2016-01-24 03:40:00 
1051  ?   ?   2016-01-24 03:50:00 
1051  ?   ?   2016-01-24 04:00:00 
1051  ?   ?   2016-01-25 04:10:00 
..  ..   ..   .. 

ich einen Datensatz kompliziert haben. Also möchte ich interpolieren, um einen saubereren Datensatz zu erhalten. Ich habe dies versuchen:

data.frame(datetime = seq(roomsdatetime$datetime[1], roomsdatetime$datetime[nrow(roomsdatetime)], by = "10 min")) %>% 
    mutate(roomsdatetime, approx = na.approx(roomsdatetime$old_value)) 

ich diesen Fehler:

Error: wrong result size(3562), expected 3565 or 1

Gibt es eine andere Art und Weise?

+0

ist nicht klar, was Sie fordern. Möchten Sie Ihre Daten in ein 10-Minuten-Intervall umwandeln? Wenn dies der Fall ist, siehe Beispiele hier http://stackoverflow.com/a/10423613/2824732 – Robert

+0

Vorsicht bei der linearen Interpolation! "Die Transformation der Daten in gleich beabstandete Beobachtungen unter Verwendung linearer Interpolation kann eine Reihe signifikanter und schwer quantifizierbarer Verzerrungen einführen". Ref: M. Scholes und J. Williams, "Schätzung Betas von nichtsynchronen Daten", Journal of Financial Economics 5: 309-327, 1977. http://www.sciencedirect.com/science/article/pii/0304405X77900411 Ihr Ziel Es ist natürlich nicht möglich, gleich beabstandete Daten zu erhalten, aber Sie versuchen trotzdem, eine Interpolation zu verwenden. –

+0

Typ der Interpolation fehlt auch in der Frage: linear, quadratisch, kubisch, etc .. Do '? smooth.spline' in der Konsole, um Interpolationen dritten Grades über 'smooth.spline' zu ​​analysieren. –

Antwort

0

In Excel, geben Sie die folgenden zum überließest-top:

[Die „Differenz“ (in Sekunden zwischen (geordnet) Datetimes und der Basis 2016.01.24 03.20.00, dessen Wert 0 zugewiesen wird) Spalte über die Formel "= (B3- $ B $ 2) * 86400"]

name   datetime difference old  new 
1051 24.01.2016 03:20:00 0  NA  NA 
1051 24.01.2016 03:22:37 157 38656 38400 
1051 24.01.2016 03:30:00 600  NA  NA 
1051 24.01.2016 03:40:00 1200 NA  NA 
1051 24.01.2016 03:50:00 1800 NA  NA 
1051 24.01.2016 03:56:33 2193 5120 4864 
1051 24.01.2016 04:00:00 2400 NA  NA 
1051 24.01.2016 04:03:28 2608 5888 5632 
1051 24.01.2016 04:34:22 4462 5632 38144 
1051 25.01.2016 04:10:00 89400 NA NA 
1051 25.01.2016 08:08:16 103696 37376 37632 

Dann Datei erhalten - speichern unter - [Dateiname: seymaalaca.csv; Typ: "CSV (Komma getrennt) (* .csv)"]

mydataframe <- read.csv("C:/Users/User/Documents/Revolution/seymaalaca.csv", header=TRUE, sep=",", stringsAsFactors = FALSE) 
mydataframe # results in: 



    name   datetime difference old new  
1 1051 24.01.2016 03:20:00   0 NA NA  
2 1051 24.01.2016 03:22:37  157 38656 38400  
3 1051 24.01.2016 03:30:00  600 NA NA  
4 1051 24.01.2016 03:40:00  1200 NA NA  
5 1051 24.01.2016 03:50:00  1800 NA NA  
6 1051 24.01.2016 03:56:33  2193 5120 4864  
7 1051 24.01.2016 04:00:00  2400 NA NA  
8 1051 24.01.2016 04:03:28  2608 5888 5632  
9 1051 24.01.2016 04:34:22  4462 5632 38144  
10 1051 25.01.2016 04:10:00  89400 NA NA  
11 1051 25.01.2016 08:08:16  103696 37376 37632 

oldcolumn <- lm(mydataframe$old ~ mydataframe$difference) 
oldcolumn # old = 1.348e+04 + 2.233e-01*difference 
oldfunction <- function (difference) {1.348e+04 + 2.233e-01*difference} # produces the row values for the "old" column 

newcolumn <- lm(mydataframe$new ~ mydataframe$difference) 
newcolumn # new = 2.14e+04 + 1.56e-01*difference 
newfunction <- function (difference) {2.14e+04 + 1.56e-01*difference} # produces the row values for the "new" column 

myinterpolizer <- function (difference) {c(oldfunction(difference),newfunction(difference))} # produces the row values for the "old&new" column 

myinterpolizer(0) # 13480 21400 
myinterpolizer(600) # 13613.98 21493.60 
myinterpolizer(1200) # 13747.96 21587.20 
myinterpolizer(1800) # 13881.94 21680.80 
myinterpolizer(2400) # 14015.92 21774.40 
myinterpolizer(89400) # 33443.02 35346.40 

Etwas einfacher Einzeiler, die über 12 Nummern produziert:

# mydataframe[is.na(mydataframe$old),] # filters the rows where old=NA 
# mydataframe[is.na(mydataframe$old),3] # After (filtering the rows where old=NA) select (the "difference" column) 
lapply(mydataframe[is.na(mydataframe$old),3], myinterpolizer) 
+0

Seyma Alaca sollte die Lösung akzeptieren. Sie scheint nicht zu wissen, die Schaltfläche "Annehmen" oder "Diese Antwort ist nützlich" zu verwenden. –