Identifique la fecha de los cambios de valor y resuma los datos con sum () y diff () en R

Data de muestra:

 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)

Me gustaría identificar cada vez que se produce un cambio en un precio. Además, me gustaría sumar () la cantidad total ordenada entre esas dos fechas de cambio de precio. Por ejemplo, paraproduct_id == "1000", el precio cambió el 16/03/15 de $ 2.49 a $ 1.743. El total qty_ordered es 1 + 2 + 1 = 4; La diferencia entre las dos primeras fechas de cambio de precio es del 23/02/15 al 16/03/15, que es de 21 días.

Entonces, el nuevo marco de datos debe ser:

product_id sum_qty_ordered price    date_diff 
1000           4          2.490             21 
1000           1           1.743            61 
1000           2           2.490            33 

Esto es lo que he intentado:

** NOTA: para este caso, un simple "dplyr::group_by"no funcionará ya que ignorará el efecto de fecha.

1) Encontré este código deDetermine cuándo las columnas de un valor data.frame cambian y devuelven índices del cambio: Esto es para identificar cada vez que el precio cambió, que identifican la primera fecha en que el precio cambió para cada producto.

IndexedChanged <- c(1,which(rowSums(sapply(sampleData[,3],diff))!=0)+1)
sampleData[IndexedChanged,]

Sin embargo, no estoy seguro de cómo calcular elsum(qty_ordered) y la diferencia de fecha para cada una de esas entradas si uso ese código.

2) Traté de escribir un ciclo WHILE para almacenar temporalmente cada lote deproduct_id, precio, rango de fechas (por ejemplo, un subconjunto de marco de datos con unoproduct_id, un precio y todas las entradas variaron desde la fecha más temprana de cambio de precio hasta la última fecha de precio antes de que cambiara), y luego, resuma ese subconjunto para obtener la suma (sum_qty_ordered) y la fecha dif. Sin embargo, creo que siempre estoy confundido por WHILE y FOR, por lo que mi código tiene algunos problemas. Aquí está mi código:

crear un marco de datos vacío para el almacenamiento de datos posterior

 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) 

crear una tabla temporal para almacenar las entradas de orden de precio de lote

 temp_dataset <- data.frame(
                     product_id = character(),
                     qty_ordered = double(),
                     price = double(),
                     date=as.Date(character()),                                  
                     stringsAsFactors=FALSE) 

loop: Esto es desordenado ... y probablemente no tenga sentido, así que realmente ayudo en esto.

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)



        }
    }

}

He buscado mucho en preguntas relacionadas, pero todavía no he encontrado nada relacionado con este problema. Si tiene alguna sugerencia, hágamelo saber. Además, proporcione algunas sugerencias sobre la solución a mis preguntas. Agradecería mucho su tiempo y ayuda!

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      

Respuestas a la pregunta(1)

Su respuesta a la pregunta