2016-09-18 3 views
5

Meine Daten enthält eine Spalte mit Bestelldaten. Es hat auch eine Spalte mit Lieferterminen. Einige der Liefertermine sind ein Datum (1990.12.31), die vor dem Bestelldatum aufgetreten, was zu Problemen bei der Berechnung der durchschnittliche Lieferzeit verursacht. Ich mag das Bestelldatum für diese Zeilen nehmen und eine zufällige Anzahl von Tagen von einer gleichmäßigen Verteilung hinzuzufügen.Hinzufügen einer zufälligen Anzahl von Tagen zu Daten über eine Funktion

Zuerst habe ich versucht, eine Funktion zu schreiben, die ich auf die Daten anwenden könnte, aber das Ergebnis war nicht das, was ich wollte. Ich möchte, dass das simulierte Lieferdatum in der Spalte Lieferdatum endet.

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

Beispieldaten:

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 

Antwort

1

Wenn ich nicht etwas falsch gemacht haben, ist x ein Datenrahmen mit zwei Spalten. Eine vektorisierte if Implementierung kann über ifelse erreicht werden:

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

Oder ein schneller Ersatz:

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) 

Mit Ihrem Beispiel-Datensatz und der gleichen zufälligen Samen 0, beide Optionen das gleiche Ergebnis:

# 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 

Im ersten Fall gibt ifelse allein ganze Zahlen zurück (die interne Darstellung von "Date"), also brauchen wir um ihm eine "Date" -Klasse zu geben, um es zu einem "Date" zu machen.

Verwandte Themen