Определите дату изменения значения и суммируйте данные с помощью sum () и diff () в R

Пример данных:

 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)

Я хотел бы определить каждый раз, когда произошло изменение цены. Кроме того, я хотел бы суммировать () общее qty_ordered между этими двумя датами изменения цены. Например, дляproduct_id == "1000", цена изменилась 16.03.15 с $ 2,49 до $ 1,743. Общее количество qty_ordered составляет 1 + 2 + 1 = 4; разница между этими двумя самыми ранними датами изменения цены составляет от 2/23/15 до 3/16/15, что составляет 21 день.

Таким образом, новый фрейм данных должен быть:

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

Вот что я попробовал:

** ПРИМЕЧАНИЕ: для этого случая простоеdplyr::group_by"не будет работать, так как будет игнорировать эффект даты.

1) Я нашел этот код изОпределите, когда столбцы data.frame изменяют значение и возвращают индексы изменения: Это должно идентифицировать каждый раз, когда цена изменилась, которые идентифицируют первую дату, когда цена изменилась для каждого продукта.

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

Однако я не уверен, как рассчитатьsum(qty_ordered) и разница в дате для каждой из этих записей, если я использую этот код.

2) Я попытался написать цикл WHILE для временного хранения каждой партииproduct_id, цена, диапазон дат (например, подмножество фрейма данных с однимproduct_idодна цена и все записи варьировались от самой ранней даты изменения цены до последней даты изменения цены до ее изменения), а затем суммируйте это подмножество, чтобы получить сумму (sum_qty_ordered) и дата различий Тем не менее, я думаю, что меня всегда смущают WHILE и FOR, поэтому в моем коде есть некоторые проблемы. Вот мой код:

создать пустой фрейм данных для последующего хранения данных

 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) 

создать временную таблицу для хранения записей заказа на пакетную цену

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

цикл: это грязно ... и, вероятно, не имеет смысла, поэтому я действительно помогаю в этом.

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)



        }
    }

}

Я много искал по связанным вопросам, но пока не нашел ничего, что связано с этой проблемой. Если у вас есть предложения, пожалуйста, дайте мне знать. Также, пожалуйста, предоставьте некоторые предложения по решению моих вопросов. Буду очень признателен за ваше время и помощь!

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      

Ответы на вопрос(1)

Ваш ответ на вопрос