自变量改变dplyr以来的天数

Pat*_* W. 4 r dplyr

有没有人知道dplyr计算变量变化后的天数的方法(按组)?例如,考虑自特定商店上次更改其价格以来的天数.

library(dplyr)
df <- data.frame(store = c(34, 34, 34, 34, 34, 28, 28, 28, 81, 81),
                 date  = c(20111231, 20111224, 20111217, 20111210, 20111203,
                           20111224, 20111217, 20111203, 20111231, 20111224),
                 price = c(3.45, 3.45, 3.45, 3.36, 3.45, 3.17, 3.25, 3.15,
                           3.49, 3.17))
df <- df %>% mutate(date = as.Date(as.character(date), format = "%Y%m%d")) %>%
        arrange(store, desc(date)) %>% group_by(store) %>% 
        mutate(pchange = price - lead(price))
df$days.since.change <- c(7, 14, 0, 21, 14, 7, 7, 0, 7, 0)
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用dplyr生成一个名为的变量days.since.change.例如,商店34在2012-12-31收取3.45美元,这个价格已经生效了21天(因为它在2012-12-10收取3.36美元).变量在上方手动显示.挑战在于商店可能会将其价格更改回较早的价格水平,从而使某些分组策略无效.

aos*_*ith 6

一种选择是计算每个商店的每个价格列表之间的天数,然后添加第二个分组变量以将价格没有变化的连续日期分组.然后在经过的日子里取累计金额.

我用数据集按日期按升序排序,lag而不是lead避免使用arrange两次,但当然你可以改变它.我还将group变量留在了数据集中,您可能不会想要这个变量,可以通过取消分组然后使用来删除select.

df %>% mutate(date = as.Date(as.character(date), format = "%Y%m%d")) %>%
    arrange(store, date) %>% 
    group_by(store) %>% 
    mutate(pchange = price - lag(price), dchange = as.numeric(date - lag(date))) %>%
    group_by(store, group = cumsum(c(1, diff(price) != 0))) %>%
    mutate(dchange = cumsum(dchange))

Source: local data frame [10 x 6]
Groups: store, group

   store       date price pchange dchange group
1     28 2011-12-03  3.15      NA      NA     1
2     28 2011-12-17  3.25    0.10      14     2
3     28 2011-12-24  3.17   -0.08       7     3
4     34 2011-12-03  3.45      NA      NA     1
5     34 2011-12-10  3.36   -0.09       7     2
6     34 2011-12-17  3.45    0.09       7     3
7     34 2011-12-24  3.45    0.00      14     3
8     34 2011-12-31  3.45    0.00      21     3
9     81 2011-12-24  3.17      NA      NA     1
10    81 2011-12-31  3.49    0.32       7     2
Run Code Online (Sandbox Code Playgroud)