【问题标题】:interpolation for limited number of NA有限数量的 NA 的插值
【发布时间】:2018-09-13 13:01:27
【问题描述】:

我有一个数据框 df,其中有一列包含值(仪表读数)。某些值偶尔会丢失 (NA)。

df 摘录:

row   time      meter_reading
1     03:10:00  26400
2     03:15:00  NA
3     03:20:00  27200
4     03:25:00  28000
5     03:30:00  NA
6     03:35:00  NA
7     03:40:00  30000

我正在尝试做的事情:

如果只有一个连续的 NA,我想插值(例如第 2 行的 na.interpolation)。 但是如果有两个或多个连续的 NA,我不希望 R 进行插值并将值保留为 NA。 (例如第 5 行和第 6 行)。

到目前为止,我尝试的是带有 if 条件的循环 (for...)。我的做法:

library("imputeTS")
for(i in 1:(nrow(df))) {
  if(!is.na(df$meter_reading[i]) & is.na(df$meter_reading[i-1]) & !is.na(df$meter_reading[i-2])) {
    na_interpolation(df$meter_reading) 
    }
}

给我:

Error in if (!is.na(df$meter_reading[i]) & is.na(df$meter_reading[i -  : 
  argument is of length zero

任何想法如何做到这一点?我在这里完全错了吗?

谢谢!

【问题讨论】:

  • 仅供参考,ifelse 已矢量化

标签: r loops if-statement interpolation imputets


【解决方案1】:

我不知道你的 na.interpolation 是什么,但是以上一行和下一行的平均值为例,你可以使用 dplyr 来做到这一点:

df %>% mutate(x=ifelse(is.na(meter_reading),
                       (lag(meter_reading)+lead(meter_reading))/2,
                       meter_reading))
#  row     time meter_reading     x
#1   1 03:10:00         26400 26400
#2   2 03:15:00            NA 26800
#3   3 03:20:00         27200 27200
#4   4 03:25:00         28000 28000
#5   5 03:30:00            NA    NA
#6   6 03:35:00            NA    NA
#7   7 03:40:00         30000 30000

【讨论】:

    【解决方案2】:

    快速浏览一下,您的计数器 i 从 1 开始,然后您尝试在 i-1i-2 处获取索引。

    【讨论】:

      【解决方案3】:

      这里只是补充一下,在当前的imputeTS包版本中,每个插补算法还有一个maxgap选项,可以轻松解决这个问题。你问这个问题时,可能还没有。

      您的代码如下所示:

      library("imputeTS")
      na_interpolation(df, maxgap = 1)
      

      这意味着 1 个 NA 的间隙被估算,而连续 NA 的较长间隙仍然是 NA。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-08-29
        • 2011-11-03
        • 2018-08-22
        • 2014-07-24
        • 2020-07-31
        • 2019-04-13
        • 2022-07-07
        • 2014-11-14
        相关资源
        最近更新 更多