通过列对数据进行线性插值时间序列

问题描述 投票:0回答:1

我想使用线性插值来替换 Df 上的 NA 值。在我的 Df 列上,表示每日数据的时间序列,因此 Df 采用宽格式。我的数据代表天数(以列为单位)和变量温度的值(以行为单位)。所以 DF 看起来像下面这样(这是简化的方式)

Tempdf <- data.frame ("Day1"= c(20, 22, 19, 28, NA),
"Day2" = c(NA, 24, NA, NA, 28) , "Day3"=c(23, 26, NA, NA, 29), "Day4"= c(25, 24, NA, 29, 30),"Day5"=c(24, NA, 22, 28, 29))

我有很长的时间序列数据(超过 1000 天,其中有些日子是 NA 值),所以我想根据时间序列内的数据插入这些 NA 值。我不确定是否需要指定一个范围,假设对于每个 NA 查看同一行、NA 前后 3 列的值(例如),然后插入该值。我需要这样的东西,就好像插值是基于所有列进行的,它会查看多年来的每日值,因此结果将与接近 NA 记录丢失时的日期的温度数据非常不同。

假设第 1 天:第 5 天的温度如我的示例所示:20、NA、23、25、24,我预计 NA 约为 23。

我尝试过动物园套餐,但运气不佳。

Temp2 <- na.approx(Temp1)

谢谢!

r interpolation na linear-interpolation
1个回答
0
投票

您可以在

approx
内使用
apply
。请注意,对于第一列或最后一列中缺失的值,这将简单地复制相邻值,而不是尝试推断趋势。对于内部列中的缺失值,该值将插值在相邻的非缺失列之间。

Tempdf |>
  apply(1, \(x) approx(1:length(x), x, xout = 1:length(x), rule = 2)$y) |>
  t() |>
  as.data.frame() |>
  setNames(names(Tempdf))
#>   Day1 Day2 Day3 Day4 Day5
#> 1   20 21.5 23.0 25.0   24
#> 2   22 24.0 26.0 24.0   24
#> 3   19 21.0 23.0 22.5   22
#> 4   28 30.0 29.5 29.0   28
#> 5   28 28.0 29.0 30.0   29
© www.soinside.com 2019 - 2024. All rights reserved.