我正在尝试在R Dataframe 中的值之间进行插值(线性或通过其他方法)。这些值在一个非常大的 Dataframe 中按date_index分组,并且插值是基于f_dates每天在值之间进行的。f_dates的数量会发生变化,因此可能需要为每个date_index对插值进行分组,然后将其解分组为更大的 Dataframe ?参见下面的示例。
我的代码尝试如下,但我似乎不能让分组和插值工作。
df <- data.frame("date_index"=c("20230104", "20230104", "20230104", "20230106", "20230106", "20230106"),
"f_date"=c("20230201", "20230203", "20230210", "20230201", "20230203", "20230210"),
"value" = c(1.50, 2.00, 3.25, 4.00, 3.00, 2.50)) %>%
mutate(date_index=ymd(date_index), f_date=ymd(f_date))
df %>%
group_by(date_index) %>%
arrange(f_date)
date_first <- first(df$f_date)
date_last <- last(df$f_date)
ApproxFun <- approxfun(x = df$f_date, y = df$value)
date_seq <- seq.Date(ymd(date_first), ymd(date_last), by = 1)
LinearFit <- ApproxFun(date_seq)
# the interpolated dataframe
dfi <- data.frame(f_date = date_seq, value = LinearFit)
我正在寻找的输出应该如下所示:
date_index f_date value
2023-01-04 2023-02-01 1.50
2023-01-04 2023-02-02 1.75
2023-01-04 2023-02-03 2.00
2023-01-04 2023-02-04 2.18
2023-01-04 2023-02-05 2.36
2023-01-04 2023-02-06 2.54
2023-01-04 2023-02-07 2.71
2023-01-04 2023-02-08 2.89
2023-01-04 2023-02-09 3.07
2023-01-04 2023-02-10 3.25
2023-01-06 2023-02-01 4.00
2023-01-06 2023-02-02 3.50
2023-01-06 2023-02-03 3.00
2023-01-06 2023-02-04 2.93
2023-01-06 2023-02-05 2.86
2023-01-06 2023-02-06 2.79
2023-01-06 2023-02-07 2.71
2023-01-06 2023-02-08 2.64
2023-01-06 2023-02-09 2.57
2023-01-06 2023-02-10 2.50
3条答案
按热度按时间ukxgm1gy1#
我不知道如何用一个“开箱即用”的功能来实现这一点,尽管我不怀疑这是可能的。首先,让我们做数据,然后我会解释解决方案。
我写了一个函数,用一个刚刚确定的分段线性回归模型进行插值-它的参数与
value
变量的非缺失值一样多。然后,它使用该模型以value
的观测值作为节点来生成预测。使用插值函数,您可以按
date_index
对数据进行分组,然后生成从f_date
的最小值到最大值的新日期序列,然后将其合并回原始数据。您可以按date_index
分组,然后将插值函数应用于f_date
和value
。结果看起来好像是你想要的。无论在观测端点之间有多少“内部”观测值,这都应该有效。创建于2023-06-01使用reprex v2.0.2
toe950272#
下面是一个使用
tidyr::complete()
函数和approx()
完整的函数是一个方便的拥有,并将填补在给定的序列中的缺失值,在这种情况下,在1天的间隔。
一旦定义了缺失的日期,则只需使用approx函数来插值NA值。
b5lpy0ml3#
以下是我使用
summarise
和unnest
的情况:创建于2023-06-01使用reprex v2.0.2