在`dplyr`中的`summarise`中使用组大小(`group_size`)

时间:2018-05-16 04:26:27

标签: r dplyr

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

E.g按柱面计算手册的比例,将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

有办法做到这一点吗?

2 个答案:

答案 0 :(得分:3)

您可以使用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

答案 1 :(得分: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