Среднее количество дней между 2 столбцами дат R

#r #date #datetime #statistics

Вопрос:

У меня есть 2 столбца дат в фрейме данных с более чем 100 тысячами наблюдений

дата 1 дата начала
2020-07-30 23:00:00 NA
2020-12-10 04:00:00 2021-06-30 20:00:00
2020-10-26 21:00:00 NA
2019-12-03 03:01:00 2020-02-01 01:00:00
NA 2020-06-28 07:30:00

Я должен заполнить недостающие значения в столбце дата начала, поэтому моя идея состоит в том, чтобы вычислить среднее значение дней между датой 1 и датой начала и заменить NA в дате начала после, выполнив сложение между этим средним значением и датой 1.

ЖЕЛАЕМЫЙ РЕЗУЛЬТАТ

Например, если среднее число дней равно 70, то :

дата 1 дата начала
2020-07-30 23:00:00 2020-10-08 23:00:00
2020-12-10 04:00:00 2021-06-30 20:00:00
2020-10-26 21:00:00 2021-01-04 21:00:00
2019-12-03 03:01:00 2020-02-01 01:00:00
NA 2020-06-28 07:30:00

Воспроизводимый пример :

структура(список(дата1 = структура(c(1594069500, 1575320400, 1603742400, NA, 1574975100, 1570845660, 1575061500, 1564714860, 1576544400, 1574802300, 1576198800, 1575338460, 1575666180, НА, 1594327800, 1595365200, 1594069800, 1591905600, 1594414800, NA), класс = c(«POSIXct», «POSIXt»), tzone = «»), дата начала = структура(c(1599242400, 1577127600, NA, 1603396800, 1577516400, 1573714800, 1577689200, 1566374400, 1577343600, 1577516400, 1577343600, НА, 1577257200, НА, 1605193200, 1605106800, 1600358400, 1600358400, 1600272000, NA), класс = c(«POSIXct», «POSIXt»), tzone = «UTC»)), строка.имена = c(1L, 2L, 7591L, 8301L, 8692L, 8694L, 8699L, 8703L, 8706L, 8709L, 8710L, 8714L, 8715L, 8730L, 8732L, 8733L, 8736L, 8740L, 8745L, 8749L ), класс = «данные.кадр»)

Ответ №1:

Вы можете использовать difftime для расчета средней продолжительности между startdate и date1 . Замените NA значения в startdate , добавив среднее значение в date1 .

 avg <- as.numeric(mean(difftime(df$startdate, df$date1, units = 'secs'), na.rm = TRUE))
df$startdate[is.na(df$startdate)] <- df$date1[is.na(df$startdate)]   avg
df
 

Комментарии:

1. Значение среднего значения по моим полным данным равно NaN. Вы знаете, откуда это может взяться, так как мы используем na.rm=T ?

2. Вы можете проверить пару вещей. 1) В вашем реальном наборе данных называются имена столбцов startdate date1 или они называются как-то иначе? 2) Всегда ли один из столбцов NA ?

3. я правильно переименовал столбцы в коде перед выполнением, и ни один из моих столбцов не всегда является NA

4. нет, на самом деле вы были правы, в этом примере обе колонки никогда не заполняются одновременно, моя ошибка.

Ответ №2:

что-то вроде этого?? Я не могу проверить, так как желаемый результат не соответствует вашим данным образца..

 library(data.table)
setDT(mydata)
mydata[is.na(startdate) amp; !is.na(date1), 
       startdate := date1   round(mean(abs(DT$date1 - DT$startdate), na.rm = TRUE))]