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