Принятие среднего числа опережений и задержек в dplyr mutate - PullRequest
1 голос
/ 27 апреля 2020

Я пытаюсь найти среднее значение даты строки выше и строки ниже. Однако, lag (Date) и lead (Date) создают векторы, которые означают (), а затем отказываются работать с возвратом NA (полагая, что это заняло у меня слишком много времени).

df <- data_frame(Date = as.Date(c("2020-01-01", NA, "2020-12-12")))
df <- mutate(df, Date = replace_na(Date, mean(c(lag(Date),lead(Date)))))

Это дает ("2020-01-01", NA, "2020-12-12"), тогда как я хочу (2020-01-01, "2020-06-06" , "2020-12-12")

Так как мне получить доступ к предыдущему и следующему значению строки для даты, чтобы я мог сгенерировать среднее значение?

Ответы [ 2 ]

2 голосов
/ 27 апреля 2020

data_frame устарела, поэтому мы заменили его на data.frame. tibble будет альтернативой, но включает в себя дополнительную зависимость. Используйте na.approx в зоопарке и конвертируйте его обратно в класс Date, так как он выдает числовой вывод c. Это также работает для интерполяции нескольких NA подряд. Это не сработало бы, если бы мы использовали lead и lag. Если на концах есть NA, это оставляет их как есть, или мы могли бы использовать другие аргументы для na.approx, чтобы заполнить их; однако в данных примера нет таких NA, поэтому мы оставляем это, как показано.

(Обратите внимание, что правильная точка на полпути показана ниже, чем в вопросе. Между 2020- 01-01 и 2020-06-22, а также между 2020-06-22 и 2020-12-12.)

library(dplyr)
library(zoo)

df <- data.frame(Date = as.Date(c("2020-01-01", NA, "2020-12-12"))) # test input

mutate(df, Date = as.Date(na.approx(Date, na.rm = FALSE)))

, что дает:

        Date
1 2020-01-01
2 2020-06-22
3 2020-12-12
1 голос
/ 27 апреля 2020

Base R один вкладыш, решающий ваши выборочные данные (подозревая, что у вас есть несколько экземпляров NA - см. Решение ниже):

df$Date <- ifelse(is.na(df$Date), mean(df$Date, na.rm = TRUE), df$Date)

Даты интерполяции:

df$Date <- as.Date(ifelse(
  is.na(df$Date),
  approx(as.numeric(df$Date), method = "linear", n = nrow(df))$y[which(is.na(df$Date))]
  ,
  df$Date
),
origin = as.Date("1970-01-01", "%Y-%m-%d"),
"%d-%m-%Y")

Используемые данные:

df <- data.frame(Date = as.Date(c("2020-01-01", NA, "2020-12-12")))
...