汇总到最大类别

Summarise to largest category

我有时会遇到一个问题。我想折叠我的数据框,一列应该 return 组中最大的类别,即使每个类别都有多个观察结果。示例:

library(dplyr)
df <- tibble(grp = c(1, 1, 1, 1, 2, 2, 2, 2),
             cat = c("A", "B", "B", "A", "C", "D", "C", "C"),
             val = c(1, 2, 1, 4, 1, 8, 2, 1))

# # A tibble: 8 x 3
# grp cat     val
# <dbl> <chr> <dbl>
# 1     1 A         1
# 2     1 B         2
# 3     1 B         1
# 4     1 A         4
# 5     2 C         1
# 6     2 D         8
# 7     2 C         2
# 8     2 C         1

预期输出:

# A tibble: 2 x 3
    grp val biggest_cat
  <dbl>    <dbl> <chr>      
1     1        8 A          
2     2       12 D   

请注意,对于第 2 组,我希望对猫 D 进行 return 编辑,因为 D 的 val 总和大于猫 C 的总和。

有效:

df %>% 
  group_by(grp, cat) %>% 
  summarise(val = sum(val)) %>% 
  group_by(grp) %>% 
  summarise(val = sum(val),
           biggest_cat = first(cat, order_by = -val))

但我想在没有双重总结的情况下做到这一点:

df %>% 
  group_by(grp) %>% 
  summarise(val = sum(val),
           biggest_cat = <Some function>)

也许有 forcats 解决方案之类的?

谢谢! :)

我们可以 group_by catgrp 计算 sum 和 select 行 max 值为 sum在每个 grp 中。

library(dplyr)
df %>% 
  group_by(grp, cat) %>% 
  summarise(val = sum(val)) %>%
  summarise(cat = cat[which.max(val)],
            biggest_cat = sum(val))

要用一个 summarise 来做到这一点,我们可以使用 tapply :

df %>% 
  group_by(grp) %>% 
  summarise(total_val = sum(val), 
            biggest_cat = names(which.max(tapply(val, cat, sum))))


#    grp total_val biggest_cat
#  <dbl>     <dbl> <chr>      
#1     1         8 A          
#2     2        12 D