【问题标题】:Summarising among the selected rows在选定的行中汇总
【发布时间】:2020-11-06 00:17:36
【问题描述】:

您好,我有一个类似这个示例的数据文件:

a<-tribble(
  ~s.no,~a,~b,~volume,
  1,51,52,200,
  2,52,51,500,
  3,51,58,44,
  4,58,51,22
)
  

这张桌子是什么?

行表示每条道路在两个方向上的体积。例如:s.no 1 显示道路 51 到 52 上的音量,同样 s.no, 2 显示 smae 链路上的音量,但方向相反:52 到 51。

我想要什么?

我希望将两个方向的音量加总为一个,例如:道路 51 到 52 的音量应为 200+500。有可能在 R 中吗?以下是我期望输出的示例说明。

【问题讨论】:

    标签: r filter tidyverse dplyr


    【解决方案1】:

    你可以试试

    library(tidyverse)
    a %>% 
      group_by(gr= a + b) %>% 
      summarise(s.no = min(s.no),
                a = first(a),
                b = first(b),
                vol = sum(volume)) 
    # A tibble: 2 x 5
         gr  s.no     a     b   vol
      <dbl> <dbl> <dbl> <dbl> <dbl>
    1   103     1    51    52   700
    2   109     3    51    58    66
    

    考虑a+b 的类似总和的更通用的方法,例如51 + 5250 + 53

    a %>% 
      pivot_longer(c(a, b)) %>% 
      group_by(s.no) %>% 
      mutate(gr = toString(sort(value))) %>% 
      pivot_wider() %>% 
      group_by(gr) %>% 
      summarise(s.no = min(s.no),
                volume = sum(volume)) %>% 
      separate(gr, into = letters[1:2])
    # A tibble: 2 x 4
      a     b      s.no volume
      <chr> <chr> <dbl>  <dbl>
    1 51    52        1    700
    2 51    58        3     66
    

    【讨论】:

      【解决方案2】:

      这是我们一次为 2 行创建组的想法,即

      library(dplyr)
      
      a %>% 
       group_by(grp = rep(seq(n() / 2), each = 2)) %>% 
       mutate(volume = sum(volume)) %>% 
       slice(1L) %>% 
       ungroup() %>% 
       select(-grp)
      
      # A tibble: 2 x 4
      #   s.no     a     b volume
      #  <dbl> <dbl> <dbl>  <dbl>
      #1     1    51    52    700
      #2     3    51    58     66
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-21
        • 1970-01-01
        相关资源
        最近更新 更多