如何在数据帧中的行之间执行过滤算术?

时间:2017-03-16 21:25:59

标签: r dplyr tidyr tidyverse

我有一个(整洁的)数据框,如下所示:

!> 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并根据列ab上的过滤器在行之间执行算术。 例如,我想(针对每个组)采用(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分组,然后对行上/行之间的特定值执行算术运算。 谁知道这里有一个更“整洁”和优雅的解决方案?

1 个答案:

答案 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