【问题标题】:How to perform filtered arithmetic between rows in a data frame?如何在数据框中的行之间执行过滤算术?
【发布时间】: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

现在我想根据ab 列上的过滤器对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 分组,然后对行上/行间的特定值执行算术运算。 有人知道这里有一个更“整洁”和优雅的解决方案吗?

【问题讨论】:

    标签: r dplyr tidyr tidyverse


    【解决方案1】:

    这样的?

    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
    

    【讨论】:

    • 是和否...适用于这种情况,但过滤变量(ab)可能并不总是像在这种情况下那样容易被视为逻辑/整数。想象第三个过滤变量作为根据可能级别的子集限定行的因素......
    • 您愿意提供一些例子吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-17
    • 1970-01-01
    • 1970-01-01
    • 2019-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多