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
或者其他选项是 order
和 head
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
我正在尝试结合 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
或者其他选项是 order
和 head
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