通过将传递间隔添加到另一个日期列来填充列中缺少的日期值

时间:2015-07-17 22:54:43

标签: r dataframe date-format missing-data date-arithmetic

数据:

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)]但不幸的是我不知道如何解决这个问题......

希望有人有个主意

1 个答案:

答案 0 :(得分:2)

您希望进行日期算术运算,并通过向deliveryDate列添加两天的日期间隔来填充orderDate列中的NAs。对于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