通过将交货间隔添加到另一个日期列来填充列中缺失的日期值

Fill missing date values in column by adding delivery interval to another date column

数据:

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 天) 平均交货时间是所有不包含缺失值的样本的平均值计算的时间 = (2days+1day+3days+2days+1day+2days+1day+2days):8=1,75

所以第一步需要计算平均交货时间,第二步需要输入订单日期 + 平均交货时间(以全天为单位)而不是 NA

我已经用 [is.na(DB1$deliveryDate)] 做了一些尝试,但不幸的是我不知道如何解决这个问题...

希望有人有想法

您想进行日期运算,并通过向 orderDate 列添加两天的日期间隔来在 deliveryDate 列中填写 NA。 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