R - Суммировать data.frame на интервале

Я пытаюсь суммировать переменную в data.frame за каждую пятницу.

Случайный кадр данных

mydf = data.frame(      "ID"   = c( rep( "A" , 6) , rep( "B" , 5 ) ),   "Date" = c( "2017-09-08","2017-09-10","2017-09-13","2017-09-15","2017-09-20","2017-09-22","2017-08-03","2017-08-04","2017-08-10","2017-08-11","2017-08-12" , "Var"  = c( 1,2,3,4,5,6,7,8,NA,10,11) )

mydf$Date = as.Date( mydf$Date )

mydf = cbind( mydf , "WeekDay" = weekdays( mydf$Date ) )

Что я хочу получить

df_ToGet = 
data.frame( 
    "ID"   = c( rep( "A" , 3) , rep( "B" , 2 ) ),
    "Date" = c( "2017-09-08","2017-09-15","2017-09-22","2017-08-04","2017-08-11"  ),
    "Var_Sum"  = c( 1 , 9 , 11 , 15, 10 )
    )

Что я пробовал

Я рассматривал возможность использования dplyr::summarize и aggregate, но не знаю, как правильно установить условие by.

mydf %>% group_by( ID ) %>% summarize( Var_Sum = aggregate( Var , sum ,  by=list ( (mydf$Weekday)=="Friday") )  )

Я видел несколько подобных вопросов, решаемых с помощью функции cut, но это, похоже, устанавливает условие на стандартную неделю? Я еще не слишком знаком с этим.


person mathnoob    schedule 21.10.2017    source источник


Ответы (1)


Нам нужно создать группирующую переменную, используя cumsum

mydf %>%
    slice(seq_len(tail(which(WeekDay== "Friday"), 1))) %>% 
    group_by(ID, grp = lag(cumsum(WeekDay == "Friday"), default = 0)) %>% 
    summarise(Date = Date[WeekDay == "Friday"], Var = sum(Var, na.rm = TRUE)) %>%
    ungroup() %>%
    select(-grp)
# A tibble: 5 x 3
#     ID       Date   Var
#   <fctr>     <date> <dbl>
#1      A 2017-09-08     1
#2      A 2017-09-15     9
#3      A 2017-09-22    11
#4      B 2017-08-04    15
#5      B 2017-08-11    10
person akrun    schedule 21.10.2017
comment
Похоже, я был прав, когда спросил об этом, вместо того, чтобы понять это сам. Спасибо. Можно ли улучшить это, чтобы учесть несколько переменных? Например, имея 100 переменных для суммирования. Если для этого потребуется задать новый вопрос, дайте мне знать, и я сделаю это вместо этого. - person mathnoob; 21.10.2017
comment
Чтобы суммировать больше переменных, используйте summarize_all или summarize_each вместо summarize. - person danh; 21.10.2017
comment
Хорошо, понял. Привет @danh - person mathnoob; 21.10.2017