有没有人知道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美元).变量在上方手动显示.挑战在于商店可能会将其价格更改回较早的价格水平,从而使某些分组策略无效.
一种选择是计算每个商店的每个价格列表之间的天数,然后添加第二个分组变量以将价格没有变化的连续日期分组.然后在经过的日子里取累计金额.
我用数据集按日期按升序排序,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)
| 归档时间: |
|
| 查看次数: |
158 次 |
| 最近记录: |