在R中是否有方法将函数slice_max(dplyr)和fct_other(forcats)结合起来?

在R中是否有方法将函数slice_max(dplyr)和fct_other(forcats)结合起来?,r,dplyr,tidyverse,forcats,R,Dplyr,Tidyverse,Forcats,我试图结合来自dplyr的函数slice_max和来自forcats的函数fct_other来获得数据帧的前n个切片,基于一个数值变量,但我不想丢失非前n个因子。我希望这些其他因素被指定为“其他因素”,以便在我需要时进行总结或计算 例如,使用与此类似的数据帧: df <- data.frame(acron = c("AA", "BB", "CC", "DD", "EE", "FF&

我试图结合来自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))
获得下一个结果:

acron值
DD 10
AA 6
BB 4

但我想指定删除“acron”的因子“Others”,类似于使用forcats函数fct_other获得的结果。我尝试过此代码,但它似乎不起作用:

df %>% 
  mutate(acron = fct_other(acron, keep = slice_max(value, n = 3), other_level = "Others"))
有没有建议买这样的东西

acron值
DD 10
AA 6
BB 4
其他3
其他1
其他1
其他1

甚至像这样:

acron值
DD 10
AA 6
BB 4
其他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

或者其他选项是
顺序
标题
df%>% 变异(acron=fct_other(acron,keep=head)(acron[order(-value)],3), 其他_level=“其他”))%>% 排列(描述(值)) #acron值 #第10日第1日 #2 AA 6 #3 BB 4 #4其他3 #5其他1 #6其他1 #7其他1


或者先排列
,然后使用

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
df%>%
排列(描述(值))%>%
分组人(acron=fct)其他(acron,keep=head(acron,3),
其他_level=“其他”))%>%
总结(价值=总和(价值))
#一个tibble:4x2
#acron值
#    
#1 AA 6
#2 BB 4
#第3 DD 10
#4其他6

如果我们想使用带有
slice\u 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

或者其他选项是
顺序
标题
df%>% 变异(acron=fct_other(acron,keep=head)(acron[order(-value)],3), 其他_level=“其他”))%>% 排列(描述(值)) #acron值 #第10日第1日 #2 AA 6 #3 BB 4 #4其他3 #5其他1 #6其他1 #7其他1


或者先排列
,然后使用

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
df%>%
排列(描述(值))%>%
分组人(acron=fct)其他(acron,keep=head(acron,3),
其他_level=“其他”))%>%
总结(价值=总和(价值))
#一个tibble:4x2
#acron值
#    
#1 AA 6
#2 BB 4
#第3 DD 10
#4其他6

一个选项可以是使用
fct\u lump\u n()


一个选项可以是使用
fct\u lump\u n()


回答得好。我以前没有看到过fct\U肿块,所以只看了一眼。似乎
fct_-lump
现在被认为是“历史”的,更具体的变体是首选。例如,
fct\u lump\u min(acron,4,value)
@andrew\u reece我没有注意到它被更新了。谢谢你指出这一点,相应地修改了帖子:)@andrew_reece我使用的
fct\u lump\u n()
没有
min
参数,但你是对的,也可以使用
fct\u lump\u min()
通过指定
min
参数来解决这个问题:)@tmfmnk,谢谢。就这样。关键是使用“w”作为基于另一个数值变量的加权参数。@andrew_reece建议它也起作用,但对于fct_lump_min,您需要知道下面的数值,以便将其他因素声明为“其他”,在这种情况下为4。当然,它将来会派上用场的。回答得好。我以前没有看到过fct\U肿块,所以只看了一眼。似乎
fct_-lump
现在被认为是“历史”的,更具体的变体是首选。例如,
fct\u lump\u min(acron,4,value)
@andrew\u reece我没有注意到它被更新了。谢谢你指出这一点,相应地修改了帖子:)@andrew_reece我使用的
fct\u lump\u n()
没有
min
参数,但你是对的,也可以使用
fct\u lump\u min()
通过指定
min
参数来解决这个问题:)@tmfmnk,谢谢。就这样。关键是使用“w”作为基于另一个数值变量的加权参数。@andrew_reece建议它也起作用,但对于fct_lump_min,您需要知道下面的数值,以便将其他因素声明为“其他”,在这种情况下为4。当然,它将来会派上用场的。谢谢@akrun。您的建议是正确的,但使用建议的函数fct_lump_n,使用参数“w”作为权重,更简单谢谢@akrun。您的方法是正确的,但使用建议的函数fct_lump_n(使用参数“w”作为权重)更简单