Identifizieren Sie das Datum einer Wertänderung und fassen Sie die Daten mit sum () und diff () in R @ zusamme
Beispieldaten
product_id <- c("1000","1000","1000","1000","1000","1000", "1002","1002","1002","1002","1002","1002")
qty_ordered <- c(1,2,1,1,1,1,1,2,1,2,1,1)
price <- c(2.49,2.49,2.49,1.743,2.49,2.49, 2.093,2.093,2.11,2.11,2.11, 2.97)
date <- c("2/23/15","2/23/15", '3/16/15','3/16/15','5/16/15', "6/18/15", "2/19/15","3/19/15","3/19/15","3/19/15","3/19/15","4/19/15")
sampleData <- data.frame(product_id, qty_ordered, price, date)
Ich möchte jedes Mal identifizieren, wenn sich ein Preis ändert. Außerdem möchte ich die Gesamtmenge_bestellt zwischen diesen beiden Preisänderungsdaten summieren (). Zum Beispiel fürproduct_id == "1000"
, Preisänderung am 16.03.15 von 2,49 USD auf 1,743 USD. Die Gesamtmenge_bestellt ist 1 + 2 + 1 = 4; Die Differenz zwischen diesen beiden frühesten Datum der Preisänderung beträgt 23.02.15 bis 16.03.15, was 21 Tagen entspricht.
So sollte der neue Datenrahmen sein:
product_id sum_qty_ordered price date_diff
1000 4 2.490 21
1000 1 1.743 61
1000 2 2.490 33
Hier habe ich es versucht:
** HINWEIS: für diesen Fall ein einfaches "dplyr::group_by
"funktioniert nicht, da der Datumseffekt ignoriert wird.
1) Ich habe diesen Code von @ gefundBestimmen Sie, wann Spalten eines data.frame den Wert ändern und Indizes der Änderung zurückgeben: Identifiziert jedes Mal, wenn sich der Preis geändert hat. Dabei handelt es sich um das erste Datum, an dem sich der Preis für jedes Produkt geändert hat.
IndexedChanged <- c(1,which(rowSums(sapply(sampleData[,3],diff))!=0)+1)
sampleData[IndexedChanged,]
Ich bin mir jedoch nicht sicher, wie ich das @ berechnen solsum(qty_ordered)
und der Datumsunterschied für jeden dieser Einträge, wenn ich diesen Code verwende.
2) Ich habe versucht, eine WHILE-Schleife zu schreiben, um jeden Stapel von @ zwischenzuspeicherproduct_id
, Preis, Datumsbereich (z. B. eine Teilmenge eines Datenrahmens mit einemproduct_id
, ein Preis und alle Einträge reichten vom frühesten Datum der Preisänderung bis zum letzten Datum des Preises, bevor er geändert wurde. Fassen Sie dann diese Teilmenge zusammen, um die Summe zu erhalten sum_qty_ordered
) und der Datumsunterschied. Ich denke jedoch, ich bin immer durch WHILE und FOR verwirrt, so dass mein Code einige Probleme hat. Hier ist mein Code:
rstellen Sie einen leeren Datenrahmen für die spätere Datenspeicherun
NewData_Ready <- data.frame(
product_id = character(),
price = double(),
early_date = as.Date(character()),
last_date=as.Date(character()),
total_qty_demanded = double(),
stringsAsFactors=FALSE)
Erstellen Sie eine temporäre Tabelle zum Speichern der Batch-Preisbestellungseinträge
temp_dataset <- data.frame(
product_id = character(),
qty_ordered = double(),
price = double(),
date=as.Date(character()),
stringsAsFactors=FALSE)
loop: Das ist chaotisch ... und macht wahrscheinlich keinen Sinn, also helfe ich wirklich dabei.
for ( i in unique(sampleData$product_id)){
#for each unique product_id in the dataset, we are gonna loop through it based on product_id
#for first product_id which is "1000"
temp_table <- sampleData[sampleData$product_id == "i", ] #subset dataset by ONE single product_id
#this dataset only has product of "1000" entries
#starting a new for loop to loop through the entire entries for this product
for ( p in 1:length(temp_table$product_id)){
current_price <- temp_table$price[p] #assign current_price to the first price value
#assign $2.49 to current price.
min_date <- temp_table$date[p] #assign the first date when the first price change
#assign 2015-2-23 to min_date which is the earliest date when price is $2.49
while (current_price == temp_table$price[p+1]){
#while the next price is the same as the first price
#that is, if the second price is $2.49 is the same as the first price of $2.49, which is TRUE
#then execute the following statement
temp_dataset <- rbind(temp_dataset, temp_table[p,])
#if the WHILE loop is TRUE, means every 2 entries have the same price
#then combine each entry when price is the same in temp_table with the temp_dataset
#if the WHILE loop is FALSE, means one entry's price is different from the next one
#then stop the statement at the ab,ove, but do the following
current_price <- temp_table$price[p+1]
#this will reassign the current_price to the next price, and restart the WHILE loop
by_idPrice <- dplyr::group_by(temp_dataset, product_id, price)
NewRow <- dplyr::summarise(
early_date = min(date),
last_date = max(date),
total_qty_demanded = sum(qty_ordered))
NewData_Ready <- rbind(NewData_Ready, NewRow)
}
}
}
Ich habe viel nach verwandten Fragen gesucht, aber ich habe noch nichts gefunden, was mit diesem Problem zu tun hat. Wenn Sie Vorschläge haben, lassen Sie es mich bitte wissen. Bitte machen Sie auch einige Vorschläge zur Lösung meiner Fragen. Ich würde mich sehr über Ihre Zeit und Hilfe freuen!
Here is my R version:
platform x86_64-apple-darwin13.4.0
arch x86_64
os darwin13.4.0
system x86_64, darwin13.4.0
status
major 3
minor 3.1
year 2016
month 06
day 21
svn rev 70800
language R
version.string R version 3.3.1 (2016-06-21)
nickname Bug in Your Hair