有限数量的 NA 插值
interpolation for limited number of NA
我有一个数据框 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,我想插值(例如 na.interpolation 用于第 2 行)。
但是如果有两个或多个连续的 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
有什么办法吗?我在这里完全错了吗?
谢谢!
快速查看显示您的计数器 i
从 1 开始,然后您尝试在 i-1
和 i-2
.
获取索引
我不知道你的 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
这里补充一下,在目前的imputeTS包版本中,每个插补算法还有一个maxgap
选项,可以轻松解决这个问题。可能还没有,正如你问的这个问题。
您的代码如下所示:
library("imputeTS")
na_interpolation(df, maxgap = 1)
这意味着 1 个 NA 的间隙被估算,而连续 NA 的较长间隙仍然是 NA。
我有一个数据框 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,我想插值(例如 na.interpolation 用于第 2 行)。 但是如果有两个或多个连续的 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
有什么办法吗?我在这里完全错了吗?
谢谢!
快速查看显示您的计数器 i
从 1 开始,然后您尝试在 i-1
和 i-2
.
我不知道你的 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
这里补充一下,在目前的imputeTS包版本中,每个插补算法还有一个maxgap
选项,可以轻松解决这个问题。可能还没有,正如你问的这个问题。
您的代码如下所示:
library("imputeTS")
na_interpolation(df, maxgap = 1)
这意味着 1 个 NA 的间隙被估算,而连续 NA 的较长间隙仍然是 NA。