R 中有没有一种方法可以组合函数 slice_max (dplyr) 和 fct_other(forcats)?

Is there a way in R to combine the functions slice_max (dplyr) and fct_other(forcats)?

我正在尝试结合 dplyr 中的函数 slice_max 和 forcats 中的 fct_other 来获取基于数字变量的数据帧的前 n 个切片,但我不想失去非前 n 个因素。我希望那些其他因素被指定为“其他”,以便在我需要时进行汇总或统计。

例如,使用与此类似的数据框:

df <- data.frame(acron = c("AA", "BB", "CC", "DD", "EE", "FF", "GG"), value = c(6, 4, 1, 10, 3, 1, 1))

如果我想要前 3 个主题的“价值”,我可以使用下一个代码:

df %>% 
  slice_max(value, n = 3)

得到下一个结果:

acron value
DD 10
AA 6
BB 4

但我想指定删除“acron”的因素“其他”类似于使用 forcats 中的函数 fct_other 获得的结果。我试过这段代码,但它不起作用:

df %>% 
  mutate(acron = fct_other(acron, keep = slice_max(value, n = 3), other_level = "Others"))

有什么建议可以得到这样的东西吗?:

acron value
DD 10
AA 6
BB 4
Others 3
Others 1
Others 1
Others 1

甚至像这样:

acron value
DD 10
AA 6
BB 4
Others 6

如果我们想使用slice_max的方法,它需要提取向量'acron'。使用pull,可以提取

library(dplyr)
library(forcats)
df %>% 
   mutate(acron = fct_other(acron, keep =  {.} %>% 
                                    slice_max(value, n = 3) %>% 
                                    pull(acron), other_level = "Others"))
#   acron value
#1     AA     6
#2     BB     4
#3 Others     1
#4     DD    10
#5 Others     3
#6 Others     1
#7 Others     1

或者其他选项是 orderhead df %>% mutate(acron = fct_other(acron, keep = head(acron[order(-value)], 3), other_level = "其他")) %>% 排列(描述(值)) # acron 值 #1 DD 10 #2 AA 6 #3 BB 4 #4 其他 3 #5 其他 1 #6 其他 1 #7 其他 1


或者先做arrange再用

df %>%
   arrange(desc(value)) %>%
   mutate(acron = fct_other(acron, keep = head(acron, 3), other_level = "Others"))
#   acron value
#1     DD    10
#2     AA     6
#3     BB     4
#4 Others     3
#5 Others     1
#6 Others     1
#7 Others     1

要获得汇总输出,按 sum

进行分组
df %>%
   arrange(desc(value)) %>%
   group_by(acron = fct_other(acron, keep = head(acron, 3), 
       other_level = "Others")) %>%
   summarise(value = sum(value))
# A tibble: 4 x 2
#  acron  value
#  <fct>  <dbl>
#1 AA         6
#2 BB         4
#3 DD        10
#4 Others     6

一个选项可以使用 fct_lump_n():

df %>%
 mutate(acron = fct_lump_n(acron, n = 3, w = value))

  acron value
1    AA     6
2    BB     4
3 Other     1
4    DD    10
5 Other     3
6 Other     1
7 Other     1