有没有人知道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美元)。变量在上方手动显示。挑战在于商店可能会将其价格改回到较早的价格水平,这会使某些分组策略失效。
答案 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