Заполните отсутствующие значения даты в столбце, добавив интервал доставки в другой столбец даты.

Данные:

DB1 <- data.frame(orderItemID  = 1:10,     
orderDate = c("2013-01-21","2013-03-31","2013-04-12","2013-06-01","2014-01-01", "2014-02-19","2014-02-27","2014-10-02","2014-10-31","2014-11-21"),  
deliveryDate = c("2013-01-23", "2013-03-01", "NA", "2013-06-04", "2014-01-03", "NA", "2014-02-28", "2014-10-04", "2014-11-01", "2014-11-23"))

Ожидаемый результат:

   DB1 <- data.frame(orderItemID  = 1:10,     
 orderDate= c("2013-01-21","2013-03-31","2013-04-12","2013-06-01","2014-01-01", "2014-02-19","2014-02-27","2014-10-02","2014-10-31","2014-11-21"),  
deliveryDate = c("2013-01-23", "2013-03-01", "2013-04-14", "2013-06-04", "2014-01-03", "2014-02-21", "2014-02-28", "2014-10-04", "2014-11-01", "2014-11-23"))

Привет, ребята, это снова я ;) и, к сожалению (я думаю), у меня довольно сложный вопрос... Как вы можете видеть выше, у меня есть некоторые пропущенные значения в датах доставки, и я хочу заменить их на другую дату. Эта дата должна быть датой заказа определенного товара + среднее время доставки в (полных) днях. (В примере это 1,75 дня, поэтому округляется до 2 дней) Среднее время доставки — это время, рассчитанное из среднего значения всех выборок, не содержащих пропущенных значений = (2дня+1день+3дня+2дня+1дня+2дня+1дня +2дня):8=1,75

поэтому на первом этапе необходимо рассчитать среднее время доставки, а на втором этапе необходимо ввести дату заказа + среднее время доставки (в полных днях) вместо NA

Я уже немного пробовал с [is.na(DB1$deliveryDate)], но, к сожалению, понятия не имею, как решить проблему...

Надеюсь, у кого-то есть идея


person Jarvis    schedule 17.07.2015    source источник
comment
Вы должны сначала преобразовать их в реальные векторы R Date. Работать с ними в форме персонажа просто... ну, не буду говорить.   -  person IRTFM    schedule 18.07.2015
comment
В вашем примере были опечатки, в строке deliveryDate требовалось c(...). Кроме того, вы рассматриваете даты в немецком формате как символы.   -  person smci    schedule 18.07.2015
comment
извините, здесь довольно поздно: но я исправил это... надеюсь, вы, ребята, сможете мне помочь   -  person Jarvis    schedule 18.07.2015
comment
@Jarvis: очень плохое поведение на SO - многократно публиковать один и тот же вопрос 1, 2, 3 раза. Это грубое неуважение ко времени каждого. Не делай этого.   -  person smci    schedule 18.07.2015


Ответы (1)


Вы хотите выполнить арифметику дат и заполнить NA в столбце deliveryDate, добавив интервал дат в два дня в столбец orderDate. lubridate предоставляет удобные функции для временных интервалов, таких как days(), weeks(), months(), years(), hours(), minutes(), seconds(), именно для этой цели. И во-первых, вам нужно разобрать ваши строки даты (европейского формата) в объекты даты R.

Что-то вроде следующего, используя lubridate для арифметики даты и dplyr для обработки данных:

require(dplyr)

DB1$orderDate    = as.POSIXct(DB1$orderDate, format="%d.%m.%y", tz='UTC')
DB1$deliveryDate = as.POSIXct(DB1$deliveryDate, format="%d.%m.%y", tz='UTC')

DB1 %>% group_by(orderDate) %>%
        summarize(delivery_time = (deliveryDate - orderDate)) %>%
        ungroup() %>% summarize(median(delivery_time, na.rm=T))

# median(delivery_time, na.rm = T)
#                         1.5 days
# so you round up to 2 days
delivery_days = 2.0

require(lubridate)
DB1 <- DB1 %>% filter(is.na(deliveryDate)) %>%
                mutate(deliveryDate = orderDate + days(2))

# orderItemID  orderDate deliveryDate
#           3 2013-04-12   2013-04-14
#           6 2014-02-19   2014-02-21
person smci    schedule 17.07.2015
comment
это не работает (вторая половина со смазкой): да, он указывает на те, у которых нет данных на дату доставки, и заменяет их правильной датой, но я хочу исправить это непосредственно в наборе данных. - person Jarvis; 18.07.2015
comment
@Jarvis: вам просто нужно назначить DB1 <- DB1 %>% filter ... mutate. Исправлено. - person smci; 18.07.2015
comment
@Jarvis: если вы нашли какой-либо ответ полезным (кашель, кашель), пожалуйста, проголосуйте! - person smci; 18.07.2015
comment
извините - сделал это сейчас :) У меня есть еще один вопрос, который я загрузил несколько минут назад: может быть, вы также можете взглянуть на ?! Большое спасибо, приятель! - person Jarvis; 18.07.2015