我的数据包含一列订单日期.它还有一列交货日期.一些交货日期是订单日期,这是造成在计算平均运输时间问题,之前发生的日期(1990年12月31日).我想获取这些行的订单日期,并从统一分布中添加一个随机天数.
首先,我尝试编写一个可以应用于数据的函数,但结果并不是我想要的.我想要的是模拟交货日期最终在交货日期列中.
func1 = function(x){
if(x[2]=="1990-12-31" && !is.na(x[2]))
x[2] = as.Date(x[1]) + floor(runif(1,min=0,max=30))
return (x)
}
Run Code Online (Sandbox Code Playgroud)
示例数据:
x <- structure(list(orderDate = structure(c(15706, 15706, 15706, 15706,
15706), class = "Date"), deliveryDate = structure(c(15707, 15707,
7669, 15707, 7669), class = "Date")), .Names = c("orderDate",
"deliveryDate"), row.names = c(NA, 5L), class = "data.frame")
# orderDate deliveryDate
#1 2013-01-01 2013-01-02
#2 2013-01-01 2013-01-02
#3 2013-01-01 1990-12-31
#4 2013-01-01 2013-01-02
#5 2013-01-01 1990-12-31
Run Code Online (Sandbox Code Playgroud)
如果我没听错的话,x是一个有 2 列的数据框。矢量化if实现可以通过以下方式实现ifelse:
x[[2]] <- structure(ifelse(x[[2]] == "1990-12-31" & !is.na(x[[2]]),
as.Date(x[[1]]) + sample(0:30, 1),
x[[2]]),
class = "Date")
Run Code Online (Sandbox Code Playgroud)
或者更快的替换:
ind <- x[[2]] == "1990-12-31" & !is.na(x[[2]])
x[ind, 2] <- as.Date(x[ind, 1]) + sample(0:30, sum(ind), replace = TRUE)
Run Code Online (Sandbox Code Playgroud)
使用您的示例数据集和相同的随机种子 0,两个选项都会给出相同的结果:
# orderDate deliveryDate
#1 2013-01-01 2013-01-02
#2 2013-01-01 2013-01-02
#3 2013-01-01 2013-01-28
#4 2013-01-01 2013-01-02
#5 2013-01-01 2013-01-28
Run Code Online (Sandbox Code Playgroud)
在第一种情况下,ifelse单独返回整数(“Date”的内部表示),因此我们需要为它提供“Date”类以使其成为“Date”。