У меня есть dataframe 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
Есть идеи, как это сделать? Я здесь совершенно не прав?
Спасибо!
Беглый взгляд показывает, что ваш счетчик 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
К вашему сведению,
ifelse
векторизован