2016-09-18 15 views
5

Dữ liệu của tôi chứa một cột ngày đặt hàng. Nó cũng có một cột ngày giao hàng. Một số ngày giao hàng là một ngày (12/31/1990) xảy ra trước ngày đặt hàng, điều này gây ra sự cố trong việc tính toán thời gian vận chuyển trung bình. Tôi muốn lấy ngày đặt hàng cho những hàng này và thêm một số ngày ngẫu nhiên từ phân phối đồng đều.Thêm số ngày ngẫu nhiên vào ngày qua một số chức năng

Trước tiên, tôi đã cố gắng viết một hàm mà tôi có thể áp dụng cho dữ liệu, nhưng kết quả không phải là những gì tôi muốn. Những gì tôi muốn là cho ngày giao hàng mô phỏng để kết thúc trong cột ngày phân phối.

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) 
} 

Ví dụ dữ liệu:

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 

Trả lời

1

Nếu tôi đã không nhận được nó sai, x là một khung dữ liệu với 2 cột. Một vectorized if thực hiện có thể đạt được thông qua 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") 

Hoặc một sự thay thế nhanh hơn:

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) 

Với ví dụ bộ dữ liệu của bạn và cùng hạt giống ngẫu nhiên 0, cả hai lựa chọn cho kết quả tương tự:

# 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 

Trong trường hợp đầu tiên, ifelse mình đang trả về số nguyên (biểu diễn nội bộ của "Ngày"), do đó chúng tôi cần để cung cấp cho "Ngày" lớp để nó làm cho nó một "Ngày".

Các vấn đề liên quan