在dplyr中如何处理重叠的分组?

3
我正在尝试根据分组因素计算“滚动”摘要统计信息。是否有一种好的方法可以基于(比如)有序因素来处理(重叠)组?
例如,假设我想通过组来计算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”行应该分成 两个 输出组。


只需要澄清一下...你所说的这些组将会被排序吗?如果它们像a,b,c,a,c,d,b,a这样是连续的,那该怎么办? - vrajs5
没错,它们将被排序。原则上,它们不需要被排序,顺序(即我想要配对的哪些)基于它们作为有序因子的顺序,而不是它们作为数据框行的顺序。 - Ben
1个回答

6

尝试使用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

我遇到了一个错误。(在Mac上使用R 3.1.0的SL版本,使用dplyr版本0.2)。错误信息为:在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) 。(有趣的是,解析似乎颠倒了操作顺序。) - IRTFM
每次对我都有效。为了确保,请在新的会话中尝试一下。我正在使用来自CRAN的dplyr 0.2和“R版本3.1.0 Patched(2014-05-09 r65562)”。 - G. Grothendieck

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接