2013-04-15 11 views
7

mam problemy z brakującymi danymi, ale nie mam NAS - w przeciwnym razie byłyby łatwiejsze w obsłudze ...dodać brakujące XTS/dane zoo z interpolacji liniowej w R

Moje dane wygląda następująco:

time, value 
2012-11-30 10:28:00, 12.9 
2012-11-30 10:29:00, 5.5 
2012-11-30 10:30:00, 5.5 
2012-11-30 10:31:00, 5.5 
2012-11-30 10:32:00, 9 
2012-11-30 10:35:00, 9 
2012-11-30 10:36:00, 14.4 
2012-11-30 10:38:00, 12.6 

Jak widać - brakuje niektórych minut - jest to xts/zoo, więc używam jako POSIXct ..., aby ustawić datę jako indeks. Jak dodać brakujące timesteps, aby uzyskać pełny ts? Chcę uzupełnić brakujące wartości za pomocą interpolacji liniowej.

Dziękuję za pomoc!

+0

jeszcze jedną z możliwych odpowiedzi: http://stackoverflow.com/questions/15114834/interpolate-zoo-object-with-missing-dates? rq = 1 działa z zoo - ale potem mogę wrócić do Xts. Nadal problem z "błędnymi" wartościami - jak filtrować i ustawić na NA? Dzięki! –

+0

Zobacz także http://stackoverflow.com/questions/11897169/change-nas-to-interpolated-flat-bars –

Odpowiedz

9

Możesz merge swoje dane z wektorem ze wszystkimi datami. Następnie możesz użyć na.approx, aby wypełnić puste pola (w tym przypadku NA).

data1 <-read.table(text="time, value 
2012-11-30-10:28:00, 12.9 
2012-11-30-10:29:00, 5.5 
2012-11-30-10:30:00, 5.5 
2012-11-30-10:31:00, 5.5 
2012-11-30-10:32:00, 9 
2012-11-30-10:35:00, 9 
2012-11-30-10:36:00, 14.4 
2012-11-30-10:38:00, 12.6", header = TRUE, sep=",", as.is=TRUE) 
times.init <-as.POSIXct(strptime(data1[,1], '%Y-%m-%d-%H:%M:%S')) 
data2 <-zoo(data1[,2],times.init) 
data3 <-merge(data2, zoo(, seq(min(times.init), max(times.init), "min"))) 
data4 <-na.approx(data3) 
4

Dzięki P Lapointe za fajną odpowiedź. Ponadto, jeśli również skorzystać z „xout” argument na.approx, które nie są już potrzebne, aby wykonać połączenie:

data1 <-read.table(text="time, value 
2012-11-30-10:28:00, 12.9 
2012-11-30-10:29:00, 5.5 
        2012-11-30-10:30:00, 5.5 
        2012-11-30-10:31:00, 5.5 
        2012-11-30-10:32:00, 9 
        2012-11-30-10:35:00, 9 
        2012-11-30-10:36:00, 14.4 
        2012-11-30-10:38:00, 12.6", header = TRUE, sep=",", as.is=TRUE) 
times.init <-as.POSIXct(strptime(data1[,1], '%Y-%m-%d-%H:%M:%S')) 
data2 <-zoo(data1[,2],times.init) 
data2 
data4 <- na.approx(object=data2, 
      xout=seq(min(times.init), max(times.init), "min")) 
Powiązane problemy