In meinem Arbeits-Datensatz, versuche ich Woche-over-Woche-Wert für die Änderungen in Groß- und Einnahmen zu berechnen. Der Code scheint zu funktionieren, aber meine Schätzungen zeigen, dass es etwa 75 Stunden dauern wird, um eine scheinbar einfache Berechnung auszuführen. Im Folgenden ist die allgemeine reproduzierbare Version, die auf dieser kleineren Datensatz läuft etwa 2m nimmt:erstellen effiziente Woche über Woche Berechnung mit subsetting
########################################################################################################################
# MAKE A GENERIC REPORDUCIBLE STACK OVERFLOW QUESTION
########################################################################################################################
# Create empty data frame of 26,000 observations similar to my data, but populated with noise
exampleData <- data.frame(product = rep(LETTERS,1000),
wholesale = rnorm(1000*26),
revenue = rnorm(1000*26))
# create a week_ending column which increases by one week with every set of 26 "products"
for(i in 1:nrow(exampleData)){
exampleData$week_ending[i] <- as.Date("2016-09-04")+7*floor((i-1)/26)
}
exampleData$week_ending <- as.Date(exampleData$week_ending, origin = "1970-01-01")
# create empty columns to fill
exampleData$wholesale_wow <- NA
exampleData$revenue_wow <- NA
# loop through the wholesale and revenue numbers and append the week-over-week changes
for(i in 1:nrow(exampleData)){
# set a condition where the loop only appends the week-over-week values if it's not the first week
if(exampleData$week_ending[i]!="2016-09-04"){
# set temporary values for the current and past week's wholesale value
currentWholesale <- exampleData$wholesale[i]
lastWeekWholesale <- exampleData$wholesale[which(exampleData$product==exampleData$product[i] &
exampleData$week_ending==exampleData$week_ending[i]-7)]
exampleData$wholesale_wow[i] <- currentWholesale/lastWeekWholesale -1
# set temporary values for the current and past week's revenue
currentRevenue <- exampleData$revenue[i]
lastWeekRevenue <- exampleData$revenue[which(exampleData$product==exampleData$product[i] &
exampleData$week_ending==exampleData$week_ending[i]-7)]
exampleData$revenue_wow[i] <- currentRevenue/lastWeekRevenue -1
}
}
Jede Verständnis Hilfe, warum das so lange dauert, oder wie man die Zeit abgeholzt würde sehr geschätzt werden!
Wahrscheinlich nicht das Hauptproblem ... nicht Strings Daten in einer Schleife analysieren; Speichere einfach ein 'd0 = as.Date (" 2016-09-04 ") irgendwo und benutze das. Auch nicht '! =' Vs eine Zeichenfolge, die bis heute analysiert werden muss. Ich vermute, dass der Hauptteil des Codes als Merge/Join statt einer Schleife geschrieben werden könnte. – Frank
Das sieht gut und reproduzierbar aus, aber (zumindest in der Zukunft) würde ich vorschlagen, auch ** minimale ** Beispiele zu machen. Es wäre viel einfacher, die Daten bei jedem Schritt zu überprüfen, um zu sehen, was mit 2 Produkten und 4 Wochen passiert, als 26 Produkte und 140 Wochen. – Gregor
Danke für die Rückmeldung! Ich wollte nicht zu sehr vereinfachen, aber Sie haben Recht, dass es minimalistischer hätte sein können. Das werde ich mir beim nächsten Mal merken. –