2015-10-17 105 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

我剛開始採用這種封裝形式,它使這種事情容易得多! –