我有一个(整洁的)数据框,如下所示:
!> 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
现在我想分组g
并根据列a
和b
上的过滤器在行之间执行算术。
例如,我想(针对每个组)采用(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
来完成。
即按g
分组,然后对行上/行之间的特定值执行算术运算。
谁知道这里有一个更“整洁”和优雅的解决方案?
答案 0 :(得分:0)
这样的东西?
df %>%
group_by(g) %>%
filter(a + b == 1) %>%
arrange(a) %>%
summarise(diff=diff(val))
# A tibble: 2 × 2
g diff
<date> <int>
1 2015-01-01 53276
2 2015-02-01 53722