2015-10-17 136 views
3

我想补充的最小​​和最大日期之间的所有缺少的日期在data.frame和线性内插所有缺失值,像线性插值缺失值

df <- data.frame(date = as.Date(c("2015-10-05","2015-10-08","2015-10-09", 
            "2015-10-12","2015-10-14")),  
       value = c(8,3,9,NA,5)) 

     date value 
2015-10-05  8 
2015-10-08  3 
2015-10-09  9 
2015-10-12 NA 
2015-10-14  5 

     date value approx 
2015-10-05  8  8 
2015-10-06 NA 6.33 
2015-10-07 NA 4.67 
2015-10-08  3  3 
2015-10-09  9  9 
2015-10-10 NA 8.20 
2015-10-11 NA 7.40 
2015-10-12 NA 6.60 
2015-10-13 NA 5.80 
2015-10-14  5  5 

是否与dplyrapprox一个明确的解决方案? (我不喜欢我的10行for循环代码。)

回答

5

这是一种方法。我使用第一个和最后一个日期创建了一个包含日期序列的数据框。在dplyr包中使用full_join(),我合并了数据帧和mydf。然后我在动物园包中使用na.approx()来处理mutate()部分中的插值。

mydf <- data.frame(date = as.Date(c("2015-10-05","2015-10-08","2015-10-09", 
            "2015-10-12","2015-10-14")),  
        value = c(8,3,9,NA,5)) 

library(dplyr) 
library(zoo) 

data.frame(date = seq(mydf$date[1], mydf$date[nrow(mydf)], by = 1)) %>% 
full_join(mydf, by = "date") %>% 
mutate(approx = na.approx(value)) 

#   date value approx 
#1 2015-10-05  8 8.000000 
#2 2015-10-06 NA 6.333333 
#3 2015-10-07 NA 4.666667 
#4 2015-10-08  3 3.000000 
#5 2015-10-09  9 9.000000 
#6 2015-10-10 NA 8.200000 
#7 2015-10-11 NA 7.400000 
#8 2015-10-12 NA 6.600000 
#9 2015-10-13 NA 5.800000 
#10 2015-10-14  5 5.000000 
5

以下是一些解决方案。

1)动物园转换数据帧动物园系列和使用na.approx与连续日期的xout=得到最终的系列

library(zoo) 
z <- read.zoo(mydf) 
zz <- na.approx(z, xout = seq(start(z), end(z), "day")) 

捐赠:

> zz 
2015-10-05 2015-10-06 2015-10-07 2015-10-08 2015-10-09 2015-10-10 2015-10-11 
    8.000000 6.333333 4.666667 3.000000 9.000000 8.200000 7.400000 
2015-10-12 2015-10-13 2015-10-14 
    6.600000 5.800000 5.000000 

可能更方便的将它留在动物园形式,所以你可以使用动物园的所有设施,但如果你需要它在数据框形式只使用

DF <- fortify.zoo(zz) 

1a)的动物园/ magrittr上述可替代地表示为magrittr管道:

library(magrittr) 
df %>% read.zoo %>% na.approx(xout = seq(start(.), end(.), "day")) %>% fortify.zoo 

(或者如果要输出动物园省略fortify.zoo一部分)。

2)基础R我们基本上可以做同样的事情,而不包这样的:

n <- nrow(mydf) 
with(mydf, data.frame(approx(date, value, xout = seq(date[1], date[n], "day")))) 
2

我觉得你的代码会看起来更清晰和简单,如果你使用Forecast包。

library(forecast) 
x <- zoo(df$value,df$date) 
x <- as.ts(x) 
x <- na.interp(x) 
print(x) 
1

另外一个不错的和短的解决方案(使用imputeTS):

library(imputeTS) 
x <- zoo(df$value,df$date) 
x <- na.interpolation(x, option = "linear") 
print(x) 
+0

我刚开始采用这种封装形式,它使这种事情容易得多! –