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      

Antworten auf die Frage(2)

Ihre Antwort auf die Frage