перекрывающиеся группы в dplyr

Я пытаюсь вычислить "скользящую" сводную статистику на основе фактора группирования. Есть ли хороший способ обработки по (перекрывающимся) группам на основе (скажем) упорядоченного фактора?

В качестве примера скажем, я хочу вычислить сумму val по группам

df <- data.frame(grp = c("a", "a", "b", "b", "c", "c", "c"),
                 val = rnorm(7))

Для групп на основе grp это просто:

df %>% group_by(grp) %>% summarise(total = sum(val))

# result:
  grp   total
1   a  1.6388
2   b  0.7421
3   c  1.1707

Однако я хочу подсчитать «скользящие» суммы для последовательных групп («a» и «b», затем «b» и «c» и т. Д.). Желаемый результат будет примерно таким:

  grp1 grp2   total
1    a    b  1.6388
2    b    c  0.7421

У меня проблемы с этим в dplyr. В частности, я не могу понять, как получить «перекрывающиеся» группы - строки «b» в приведенном выше примере должны оказаться в двух группах вывода.


person Ben    schedule 13.06.2014    source источник
comment
Одно уточнение ... Эти группы, о которых вы говорите, будут отсортированы? Что, если есть в seq как a,b,c,a,c,d,b,a?   -  person vrajs5    schedule 13.06.2014
comment
Да, они будут отсортированы. В принципе, они не должны быть такими, порядок (то есть, какие из них я хочу соединить вместе) основан на их порядке в качестве упорядоченных факторов, а не на их порядке в виде строк в df.   -  person Ben    schedule 13.06.2014


Ответы (1)


Попробуйте lag:

df %>% 
   group_by(grp) %>% 
   arrange(grp) %>%
   summarise(total = sum(val)) %>% 
   mutate(grp1 = lag(grp), grp2 = grp, total = total + lag(total)) %>%
   select(grp1, grp2, total) %>%
   na.omit
person G. Grothendieck    schedule 13.06.2014
comment
Я получаю сообщение об ошибке. (с использованием dplyr версии 0.2 на Mac с SL-версией R 3.1.0). Ошибка в select (df %>% group_by(grp) %>% arrange(grp) %>% summarise(total = sum(val)) %>% mutate(grp1 = lag(grp), grp2 = grp, total = total + lag(total)),: unused arguments (grp1, grp2, total). (Интересно, как синтаксический анализ, похоже, изменил порядок операций на обратный). - person IRTFM; 13.06.2014
comment
У меня это срабатывает каждый раз. На всякий случай попробуйте на свежем сеансе. Я использую dplyr 0.2 из CRAN и R версии 3.1.0 с исправлениями (2014-05-09 r65562) - person G. Grothendieck; 14.06.2014