簡體   English   中英

在非 NA 觀測值之間進行插值

[英]Interpolate between non-NA observations

考慮對不規則快照的觀察,其中一些是不適用的:

library(tidyverse)
library(tweenr)
df <- data.frame(date = c(ymd("20191201"), ymd("20191203"), ymd("20191207"), ymd("20191220")),
                 value = c(1, 2, NA, 5))

僅在具有非 NA 值的觀測值之間線性插值日期的最簡潔方法是什么? (在這個例子中,因為 20191201 和 20191203 有連續的非 NA 值,應該有插值)我想以某種方式使用leadlag 此代碼在所有值之間進行插值:

all_days <- data.frame(date = seq(min(df$date), max(df$date), "day"))
df %>% 
  arrange(date) %>%
  right_join(all_days) %>%
  mutate(value = value %>% tween_fill("linear"))

我們可以創建一個新列來標記我們不想插入的非 NA 值之間的日期( temp )。 使用complete填充缺失的日期序列並fill temp列並使用na.approx插入值。

library(tidyr)
library(zoo)
library(dplyr)

df %>%
  mutate(temp = +(!(is.na(value) | lead(is.na(value), default = TRUE)))) %>%
  complete(date = seq(min(date), max(date), by = "day")) %>%
  fill(temp) %>%
  mutate(temp = replace(temp, !is.na(value), 1),
        value = na.approx(value) * temp) %>%
  na_if(0) %>% select(-temp)


# A tibble: 20 x 2
#   date       value
#   <date>     <dbl>
# 1 2019-12-01   1  
# 2 2019-12-02   1.5
# 3 2019-12-03   2  
# 4 2019-12-04  NA  
# 5 2019-12-05  NA  
# 6 2019-12-06  NA  
# 7 2019-12-07  NA  
# 8 2019-12-08  NA  
# 9 2019-12-09  NA  
#10 2019-12-10  NA  
#11 2019-12-11  NA  
#12 2019-12-12  NA  
#13 2019-12-13  NA  
#14 2019-12-14  NA  
#15 2019-12-15  NA  
#16 2019-12-16  NA  
#17 2019-12-17  NA  
#18 2019-12-18  NA  
#19 2019-12-19  NA  
#20 2019-12-20  5  

這是我設想的解決方案。 主要思想是創建一個掩碼來確定將插入哪些值。 要創建掩碼,我們將一行標記為 TRUE,如果該行和下一行都具有非 NA 值,然后使用completefill填充它們之間。 為了完成掩碼,我們將最后一個連續觀察設置為 TRUE。

df %>%
  mutate(has_value = !is.na(value),
         mask = lead(has_value, default = FALSE) & has_value) %>%
  complete(date = seq(min(date), max(date), by = "day"),
           fill = list(has_value = FALSE)) %>%
  fill(mask) %>%
  mutate(mask = mask | has_value,
         value = if_else(mask, value %>% tween_fill("linear"), NA_real_)) %>%
  select(-has_value, -mask)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM