汇总到最大类别
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
cat
、grp
计算 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
我有时会遇到一个问题。我想折叠我的数据框,一列应该 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
cat
、grp
计算 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