代码之家  ›  专栏  ›  技术社区  ›  monotonic

使用dplyr进行group_by+summary时保留其他列

  •  0
  • monotonic  · 技术社区  · 4 年前

    我想做一个 group_by + summarise 只对具有一个group属性的两列执行操作,同时保持其他三列不变,这三列对每行具有相同的编号。我该怎么做?例如。

    > data<- data.frame(a=1:10, b=rep(1,10), c=rep(2,10), d=rep(3,10), e= c("small", "med", "larg", "larg", "larg", "med", "small", "small", "small", "med"))
    > data %>% group_by(e) %>% summarise(a=mean(a))
    # A tibble: 3 × 2
      e         a
      <chr> <dbl>
    1 larg   4   
    2 med    6   
    3 small  6.25
    

    但我想要

    # A tibble: 3 × 5
      e         a b     c     d
      <chr> <dbl> <dbl> <dbl> <dbl>
    1 larg   4    1     2     3
    2 med    6    1     2     3
    3 small  6.25 1     2     3
    

    分组_by+总结 总是删除其他列。我该怎么做?

    2 回复  |  直到 3 年前
        1
  •  0
  •   tauft    4 年前

    将其他列添加到 group_by :

    > library(tidyverse)
    > data <- data.frame(a=1:10, b=rep(1,10), c=rep(2,10), d=rep(3,10), e= c("small", "med", "larg", "larg", "larg", "med", "small", "small", "small", "med"))
    > data %>% group_by(e, b, c, d) %>% summarise(a=mean(a))
    `summarise()` has grouped output by 'e', 'b', 'c'. You can override using the `.groups` argument.
    # A tibble: 3 x 5
    # Groups:   e, b, c [3]
      e         b     c     d     a
      <chr> <dbl> <dbl> <dbl> <dbl>
    1 larg      1     2     3  4   
    2 med       1     2     3  6   
    3 small     1     2     3  6.25
    
        2
  •  0
  •   Lucca Nielsen    4 年前

    你总是可以用 group + summarise 并保持数据帧的其余部分“完整”添加 across() 在总结中。如果你的其他变量不总是一样,这可能会很有用。

    data %>% group_by(e) %>% 
        summarise(a=mean(a), across())
    
        # A tibble: 10 x 5
    # Groups:   e [3]
       e         a     b     c     d
       <chr> <dbl> <dbl> <dbl> <dbl>
     1 larg   4        1     2     3
     2 larg   4        1     2     3
     3 larg   4        1     2     3
     4 med    6        1     2     3
     5 med    6        1     2     3
     6 med    6        1     2     3
     7 small  6.25     1     2     3
     8 small  6.25     1     2     3
     9 small  6.25     1     2     3
    10 small  6.25     1     2     3
    
        3
  •  0
  •   www    4 年前

    目前尚不清楚要将多少列视为分组变量。如果这个数字很小,@tauft的回答就足够了。否则,我们可以使用 across 具有 group_by 以便我们可以使用 <tidy-select> 选择要分组的列。

    library(dplyr)
    
    data2 <- data %>%
      group_by(across(-a)) %>%
      summarise(a = mean(a), .groups = "drop") %>%
      relocate(e, a, .before = b)
    data2
    # # A tibble: 3 x 5
    #   e         a     b     c     d
    #   <chr> <dbl> <dbl> <dbl> <dbl>
    # 1 larg   4        1     2     3
    # 2 med    6        1     2     3
    # 3 small  6.25     1     2     3
    

    上述内容也可以写如下。

    data2 <- data %>%
      group_by(across(b:e)) %>%
      summarise(a = mean(a), .groups = "drop") %>%
      relocate(e, a, .before = b)
    
    推荐文章