Замена отсутствующих дня и месяца в датах с помощью R - PullRequest
1 голос
/ 11 октября 2019

Этот вопрос о том, как заменить пропущенные дни и месяцы во фрейме данных с помощью R. Учитывая приведенный ниже фрейм данных, 99 обозначает пропущенный день или месяц, а NA представляет даты, которые полностью неизвестны.

df<-data.frame("id"=c(1,2,3,4,5),
           "date" = c("99/10/2014","99/99/2011","23/02/2016","NA",
                      "99/04/2009"))

Я пытаюсь заменить отсутствующие дни и месяцы на основе следующих критериев:

  1. Для дат с отсутствующим днем, но известным месяцем и годом, заменаdate будет случайным выбором от середины интервала (с первого дня до последнего дня этого месяца). Например, для идентификатора 1 дата замены будет выбрана с середины 01.10.2014 по 31.10.2014. Для id 5 это будет середина с 01/04/2009 по 30/04/2009. Следует отметить различное количество дней в разные месяцы, например, 31 день в октябре и 30 дней в апреле.

  2. Как и в случае идентификатора 2, где отсутствуют день и месяцдата замены - это случайный выбор от середины интервала (от первого дня до последнего дня года), например, с 01.01.2011 по 31.12.2011.

Обратите внимание: полные даты (например, в случае с идентификатором 3) и NA не должны быть заменены.

Я пытался использовать функцию seq вместе с функциями as.POSIXct и as.Date, чтобы получить последовательность дат, из которых должны быть выбраны даты замены. Сложность, с которой я сталкиваюсь, заключается в том, как автоматизировать код R для получения интервалов дат (он варьируется в зависимости от идентификатора) и как сделать случайную ничью из середины интервалов.

Ожидаемый результат будет иметьдата замены идентификаторов 1, 2 и 5, но даты идентификаторов 3 и 4 остаются без изменений. Любая помощь в этом очень ценится.

1 Ответ

1 голос
/ 11 октября 2019

Это не самая красивая, но, похоже, она работает и адаптируется к разным месяцам и годам:

set.seed(999)
df$dateorig <- df$date

seld <- grepl("^99/", df$date)
selm <- grepl("^../99", df$date)
md <- seld & (!selm)
mm <- seld & selm
df$date <- as.Date(gsub("99","01",as.character(df$date)), format="%d/%m/%Y")

monrng <- sapply(df$date[md], function(x) seq(x, length.out=2, by="month")[2]) - as.numeric(df$date[md])
df$date[md] <- df$date[md] + sapply(monrng, sample, 1)

yrrng <- sapply(df$date[mm], function(x) seq(x, length.out=2, by="12 months")[2]) - as.numeric(df$date[mm])
df$date[mm] <- df$date[mm] + sapply(yrrng, sample, 1)

#df
#  id       date   dateorig
#1  1 2014-10-14 99/10/2014
#2  2 2011-02-05 99/99/2011
#3  3 2016-02-23 23/02/2016
#4  4       <NA>         NA
#5  5 2009-04-19 99/04/2009
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...