интерполяция для ограниченного числа NA - PullRequest
0 голосов
/ 13 сентября 2018

У меня есть датафрейм 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(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

Есть идеи, как это сделать?Я совершенно не прав здесь?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 13 сентября 2018

Я не знаю, какова ваша 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
0 голосов
/ 13 сентября 2018

Быстрый просмотр показывает, что ваш счетчик i начинается с 1, а затем вы пытаетесь получить индекс в i-1 и i-2.

...