【问题标题】:Use group size (`group_size`) in `summarise` in `dplyr` [duplicate]在`dplyr`的`summarise`中使用组大小(`group_size`)[重复]
【发布时间】:2018-10-26 00:15:59
【问题描述】:

我想在dplyr::summarise 中使用组的大小作为分组操作的一部分。

例如,通过将cars 数据按cyl 分组并将手册数除以组的大小,按柱面计算手册的比例:

mtcars %>%
  group_by(cyl) %>%
  summarise(zz = sum(am)/group_size(.))

但是,(我认为),因为 group_size 在分组 tbl_df 之后并且 . 未分组,所以返回

Error in mutate_impl(.data, dots) : basic_string::resize

有没有办法做到这一点?

【问题讨论】:

  • 我们将此标记为重复,但它有一个细微差别,即标题无法传达,以及为什么不能简单地使用count()/tally():OP 想要组的一部分尺寸。所以在分母中使用n() 而不是group_size(.),并且分子与当前相同。

标签: r dplyr


【解决方案1】:

只是mean的一个群

mtcars %>%
    group_by(cyl) %>% 
    summarise(zz = mean(am))
# A tibble: 3 x 2
#    cyl    zz
#  <dbl> <dbl>
#1     4 0.727
#2     6 0.429
#3     8 0.143

如果我们需要使用group_size

library(tidyverse)
mtcars %>%
   group_by(cyl) %>% 
   nest %>%
   mutate(zz = map_dbl(data, ~ sum(.x$am)/group_size(.x))) %>%
   arrange(cyl) %>%
   select(-data)
# A tibble: 3 x 2
#    cyl    zz
#  <dbl> <dbl>
#1     4 0.727
#2     6 0.429
#3     8 0.143

或使用do

mtcars %>%
    group_by(cyl) %>% 
    do(data.frame(zz = sum(.$am)/group_size(.)))
# A tibble: 3 x 2
# Groups:   cyl [3]
#    cyl    zz
#  <dbl> <dbl>
#1     4 0.727
#2     6 0.429
#3     8 0.143

【讨论】:

    【解决方案2】:

    您可能可以使用n() 来获取组的行数

    library(dplyr)
    mtcars %>%
      group_by(cyl) %>%
      summarise(zz = sum(am)/n())
    
    #    cyl    zz
    #  <dbl> <dbl>
    #1  4.00 0.727
    #2  6.00 0.429
    #3  8.00 0.143
    

    【讨论】:

    • length(.) 替代方案不起作用
    • @rubadubdub 对不起!删除它。
    • 这是dplyr::tally() 命令的用途,它调用n()。看我的回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-21
    • 1970-01-01
    • 1970-01-01
    • 2016-08-07
    • 1970-01-01
    相关资源
    最近更新 更多