Подставьте среднее значение предыдущих и следующих доступных значений поля для значений NA в кадре данных - PullRequest
2 голосов
/ 29 января 2020

Образец набора доступных гораздо больших наборов данных имеет следующий формат:

Station <-c("A","A","A","A","A","A","A","A","A","A","A","A","A","A","A")
Parameter <-c(2,3,NA,4,4,9,NA,NA,10,15,NA,NA,NA,18,20)
Par_Count <-c(1,1,1,2,2,1,2,2,1,1,3,3,3,1,1)

df<-data.frame(Station, Parameter, Par_Count)
df
Station  Parameter  Par_Count
   A        2          1
   A        3          1
   A        NA         1
   A        4          2
   A        4          2
   A        9          1
   A        NA         2
   A        NA         2
   A        10         1
   A        15         1
   A        NA         3
   A        NA         3
   A        NA         3
   A        18         1
   A        20         1

Я хочу приблизить NA, число которых меньше 2, со средним значением следующих и предыдущих доступных значений для NA в этот столбец. В исходном наборе данных где-то NA - это 100, так что я хочу игнорировать последовательные NA больше 3. Par_Count представляет количество последовательных вхождений этого конкретного значения в параметре. Я пробовал с: library(zoo) df1 <- within(df, na.approx(df$Parameter, maxgap = 2)) и даже для одного случая с: df1 <- within(df, Parameter[Parameter == is.na(df$Parameter) & Par_Count == 1] <- lead(Parameter) - lag(Parameter)) , но ничего не получалось. Это не изменило возникновение значения NA. Желаемый вывод выглядит так:

Station  Parameter  Par_Count
       A        2          1
       A        3          1
       A        3.5        1
       A        4          2
       A        4          2
       A        9          1
       A        9.5        2
       A        9.75       2  <--here 9.5 will also work
       A        10         1
       A        15         1
       A        NA         3
       A        NA         3
       A        NA         3
       A        18         1
       A        20         1

1 Ответ

2 голосов
/ 29 января 2020

Вы почти у цели. Я думаю, что вы неправильно истолковали использование within. Если вы хотите использовать внутри, вам нужно назначить вывод na.approx столбцу фрейма данных. Будет работать следующее:

library(zoo)
df1 <- within(df, Parameter <- na.approx(Parameter, maxgap = 2, na.rm = FALSE))

Обратите внимание, что рекомендуется использовать na.rm = FALSE, в противном случае ведущие или конечные NA будут удалены, что приведет к ошибке.

Лично я думаю, следующее более читабельно, хотя это вопрос стиля.

library(zoo)
df1 <- df
df1$Parameter <- na.approx(df$Parameter, maxgap = 2, na.rm = FALSE))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...