使用 dplyr 和 forcats 包根据分组变量中的值更改因子级别
Changing the factor level based on the value in a grouped variable using the dplyr and forcats packages
我正在尝试根据来自另一个变量的一些值来更改一个因素的水平。我将在一个例子中展示它。我有这样一个 table:
library(tidyverse)
set.seed(1)
df = tibble(
group = factor(rep(c("a", "b", "c", "d"), each = 5)),
x = c(rnorm(5, 0, 1), rnorm(5, 0, 2), rnorm(5, 0, 1.5), rnorm(5, 0, 3))
)
我想更改 group
因子的水平以降低变量 x
的标准差值。
我是这样得到的:
lev = df %>% group_by(group) %>%
summarise(sd = sd(x)) %>%
arrange(desc(sd))
df = df %>% mutate(group = fct_relevel(group, as.character(lev$group)))
但是,我不喜欢这个解决方案,因为它需要创建一个辅助 lev
table,我想避免这种情况。有谁知道如何以 dplyr
语义的典型更简单和透明的方式实现这种效果。
你要找的是forcats::fct_reorder()
:
df = df %>% mutate(group = fct_reorder(group, x, sd, .desc = TRUE))
df %>% group_by(group) %>% summarise(sd=sd(x))
我正在尝试根据来自另一个变量的一些值来更改一个因素的水平。我将在一个例子中展示它。我有这样一个 table:
library(tidyverse)
set.seed(1)
df = tibble(
group = factor(rep(c("a", "b", "c", "d"), each = 5)),
x = c(rnorm(5, 0, 1), rnorm(5, 0, 2), rnorm(5, 0, 1.5), rnorm(5, 0, 3))
)
我想更改 group
因子的水平以降低变量 x
的标准差值。
我是这样得到的:
lev = df %>% group_by(group) %>%
summarise(sd = sd(x)) %>%
arrange(desc(sd))
df = df %>% mutate(group = fct_relevel(group, as.character(lev$group)))
但是,我不喜欢这个解决方案,因为它需要创建一个辅助 lev
table,我想避免这种情况。有谁知道如何以 dplyr
语义的典型更简单和透明的方式实现这种效果。
你要找的是forcats::fct_reorder()
:
df = df %>% mutate(group = fct_reorder(group, x, sd, .desc = TRUE))
df %>% group_by(group) %>% summarise(sd=sd(x))