2016-08-03 64 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应该接受该解决方案。她似乎不知道使用“接受”或“这个答案很有用”按钮。 –