自变量改变dplyr以来的天数

时间:2014-11-18 17:59:15

标签: 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)

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

1 个答案:

答案 0 :(得分: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