2016-09-18 2 views
5

Мои данные содержат столбец дат заказа. Он также имеет столбец дат поставки. Некоторые даты поставки - это дата (12/31/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 возвращает целые числа (внутреннее представление «Дата»), поэтому нам нужно чтобы присвоить ему класс «Дата», чтобы сделать его «Датой».

Смежные вопросы