Добавление случайного числа дней к датам с помощью некоторой функции
Мои данные содержат столбец дат заказа. У этого также есть колонка дат поставки. Некоторые даты поставки - это дата (31.12.1990), которая произошла до даты заказа, что вызывает проблемы при расчете среднего времени доставки. Я хотел бы взять дату заказа для этих строк и добавить случайное количество дней из равномерного распределения.
Сначала я попытался написать функцию, которую можно было бы применить к данным, но результат оказался не тем, что я хотел. Я хочу, чтобы смоделированная дата доставки оказалась в столбце даты доставки.
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)
}
Пример данных:
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
1 ответ
Если я не понял это неправильно, 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")
Или более быстрая замена:
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)
Для вашего примера набора данных и одного и того же случайного начального числа 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
В первом случае ifelse
только возвращает целые числа (внутреннее представление "Дата"), поэтому нам нужно дать ему класс "Дата", чтобы сделать его "Дата".