【发布时间】:2017-08-08 06:37:55
【问题描述】:
我有一个(整洁的)数据框,看起来像这样:
!> my_table
# A tibble: 8 × 4
g a b val
<date> <lgl> <lgl> <int>
1 2015-01-01 FALSE FALSE 3175030
2 2015-01-01 FALSE TRUE 72229
3 2015-01-01 TRUE FALSE 125505
4 2015-01-01 TRUE TRUE 856737
5 2015-02-01 FALSE FALSE 3413510
6 2015-02-01 FALSE TRUE 69203
7 2015-02-01 TRUE FALSE 122925
8 2015-02-01 TRUE TRUE 876366
现在我想根据a 和b 列上的过滤器对g 进行分组并在行之间执行算术运算。
例如,我想(针对每个组)计算(TRUE,FALSE) 行和(FALSE,TRUE) 行之间的差异:
# A tibble: 2 × 2
g diff
<date> <int>
1 2015-01-01 53276
2 2015-02-01 53722
在非/半整洁的世界中,我会先在 (TRUE,FALSE) 行上进行过滤,然后将其与 (FALSE,TRUE) 行上的另一个过滤表连接起来,然后取 c 之间的差异每个列,如下所示:
diff_table <- inner_join(
filter(my_table, a, !b) %>% select(g, val1 = val),
,filter(my_table, !a, b) %>% select(g, val2 = val)
) %>% transmute(g, diff = val1 - val2)
这很好用...
但似乎不优雅,我想我可能错过了一种更简单的方法,可以使用group_by 完成此操作。
IE。按g 分组,然后对行上/行间的特定值执行算术运算。
有人知道这里有一个更“整洁”和优雅的解决方案吗?
【问题讨论】: