2016-08-03 266 views
2

我有以下數據集。填充缺失值日期時間序列數據與插值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 
..  ..   ..   .. 

我想插數據集:

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 
..  ..   ..   .. 

我有複雜的數據集。所以,我想插入以獲得更乾淨的數據集。我也試試這個:

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

我得到這個錯誤:

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

有另一種方式?

+0

不太清楚你問什麼。你是否想將數據轉換爲10分鐘的時間間隔?如果是這種情況請參閱這裏的示例http://stackoverflow.com/a/10423613/2824732 – Robert

+0

小心線性插值! 「使用線性插值將數據轉換爲等距觀測值可能會導致大量難以量化的偏差」。參考文獻:M.Scholes和J.Williams,「Estimating betaas from nonsynchronous data」,Journal of Financial Economics 5:309-327,1977。 http://www.sciencedirect.com/science/article/pii/0304405X77900411 Your aim當然不會獲得等間隔的數據,但無論如何,您嘗試使用插值。 –

+0

問題中也缺少插值的類型:線性,二次方,立方體等。 smooth.spline'在控制檯中通過'smooth.spline'分析3度插值。 –

回答

0

在Excel中,輸入以下到最左邊頂部:

[該「差異」(在(有序)日期時間和基部2016年1月24日,其三點20分00秒值被分配給0秒之間)通過公式 「=(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 

得到柱然後,文件 - 如保存 - [文件名:seymaalaca.csv;類型: 「CSV(逗號分隔)(* .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 

稍微簡單的一行產生上述12個號碼:

# 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應該接受該解決方案。她似乎不知道使用「接受」或「這個答案很有用」按鈕。 –