数据:
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)]但不幸的是我不知道如何解决这个问题......
希望有人有个主意
答案 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