2015-12-02 5 views
1

У меня есть кадр данных, который выглядит следующим образом:rollsum с фиксированными датами

user_id  date    price 
2375 2012/12/12 00:00:00.000 47.900000 
2375 2013/01/16 00:00:00.000 47.900000 
2375 2013/01/16 00:00:00.000 47.900000 
2375 2013/05/08 00:00:00.000 47.900000 
2375 2013/06/01 00:00:00.000 47.900000 
2375 2013/10/02 00:00:00.000 26.500000 
2375 2014/01/22 00:00:00.000 47.900000 
2375 2014/03/21 00:00:00.000 47.900000 
2375 2014/05/24 00:00:00.000 47.900000 
2375 2015/04/11 00:00:00.000 47.900000 
7419 2012/12/12 00:00:00.000 7.174977 
7419 2013/01/02 00:00:00.000 27.500000 
7419 2013/01/18 00:00:00.000 22.901482 
7419 2013/02/08 00:00:00.000 27.500000 
7419 2013/03/06 00:00:00.000 8.200000 
7419 2013/04/03 00:00:00.000 22.901482 
7419 2013/04/03 00:00:00.000 8.200000 
7419 2013/04/03 00:00:00.000 6.900000 
7419 2013/04/17 00:00:00.000 7.500000 
7419 2013/04/17 00:00:00.000 7.500000 
7419 2013/05/23 00:00:00.000 7.500000 
7419 2013/06/07 00:00:00.000 27.500000 
7419 2013/06/07 00:00:00.000 7.500000 
7419 2013/06/07 00:00:00.000 7.500000 
7419 2013/06/07 00:00:00.000 5.829188 
7419 2013/07/10 00:00:00.000 27.500000 
7419 2013/08/21 00:00:00.000 7.500000 
7419 2013/08/21 00:00:00.000 27.500000 
7419 2013/09/06 00:00:00.000 27.500000 
7419 2013/12/27 00:00:00.000 7.500000 
7419 2014/01/10 00:00:00.000 27.500000 
7419 2014/02/16 00:00:00.000 27.500000 
7419 2014/05/14 00:00:00.000 41.900000 
7419 2014/07/03 00:00:00.000 26.500000 
7419 2014/09/26 00:00:00.000 26.500000 
7419 2014/09/26 00:00:00.000 7.500000 
7419 2014/10/22 00:00:00.000 27.500000 
7419 2014/11/15 00:00:00.000 6.900000 
7419 2014/11/27 00:00:00.000 26.500000 
7419 2014/12/12 00:00:00.000 40.900000 
7419 2015/01/14 00:00:00.000 27.200000 
7419 2015/02/24 00:00:00.000 26.500000 
7419 2015/03/17 00:00:00.000 40.900000 
7419 2015/05/02 00:00:00.000 27.200000 
7419 2015/05/02 00:00:00.000 26.500000 
7419 2015/05/15 00:00:00.000 7.900000 
7419 2015/05/20 00:00:00.000 27.500000 
7419 2015/06/20 00:00:00.000 7.500000 
7419 2015/06/26 00:00:00.000 7.500000 
7419 2015/06/30 00:00:00.000 41.900000 
7419 2015/07/16 00:00:00.000 78.500000 
11860 2012/12/12 00:00:00.000 7.174977 
11860 2012/12/12 00:00:00.000 21.500000 
11860 2013/03/02 00:00:00.000 22.901482 
11860 2013/03/02 00:00:00.000 8.200000 
11860 2013/05/25 00:00:00.000 29.500000 
11860 2013/05/25 00:00:00.000 7.500000 

В действительности, у меня есть более чем 40000 user_id. Я хочу рассчитать сумму за предыдущие 4 недели (не считая текущей недели) цены для каждого пользователя. Однако период даты фиксирован с 12/12/2012 по 22/09/2015. Для того, чтобы избежать петли для каждого пользователя, я думал, что-то вроде

df <- df %>% group_by(user_id) %>% 
    mutate(price.lag1 = lag(prod_price, n = 1)) %>% 
    mutate(amount4weeks = rollsum(x=price, 4, align = "right", fill = NA)) 

Однако, это дает мне сообщение об ошибке, и он будет принимать только как «дату» строки, содержащиеся в данных.

Как я могу указать конкретные даты в роллсуме и/или как я могу делать то, что хочу в одном слое? Мой результат должен выглядеть так:

df$price4weeks = c(NA, 0.000000, 0.000000, 0.000000, 47.900000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, NA, 7.174977, 27.500000, 22.901482, 27.500000, 8.200000, 8.200000, 8.200000, 6.900000, 6.900000, 0.000000, 7.500000, 7.500000, 7.500000, 7.500000, 0.000000, 0.000000, 0.000000, 27.500000, 0.000000, 7.500000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 7.500000, 27.500000, 6.900000, 33.400000, 0.000000, 0.000000, 26.500000, 0.000000, 0.000000, 26.500000, 34.400000, 27.500000, 7.500000,15.000000, 56.900000, NA, NA, 0.000000, 0.000000, 0.000000, 0.000000) 

Сообщите мне, если у меня что-то отсутствует в моих объяснениях.

Спасибо!

ответ

2

rollsum рассчитывает сумму по количеству k чисел точек данных. Чтобы использовать dplyr с неделями, вы можете добавить столбец week_number к своим данным, а затем рассчитать текущую сумму, используя sapply по сравнению с week_number. Код может выглядеть так:

df <- mutate(df, week_number=cut.POSIXt(df$date, breaks="week", labels=FALSE)) 
df_new <- df %>% group_by(user_id) %>% 
     do(mutate(.,total_4wk=sapply(week_number, function(n) sum(.$price[between(.$week_number, n -4, n-1)],na.rm=TRUE)))) 
+0

Это работает! Спасибо! – Andres

+0

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

Смежные вопросы