Интерполяция для ограниченного числа NA

У меня есть 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

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

Спасибо!

К вашему сведению, ifelse векторизован

Sotos 13.09.2018 15:15
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
45
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Беглый взгляд показывает, что ваш счетчик 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

Другие вопросы по теме