R语言箱线图函数因子排序失效,如何修正mutate语句?
R函数中箱线图因子未按指定顺序排序的解决方法
你的问题核心在于函数里的x是传入的字符串参数,原代码的mutate(x = factor(x, ...))并没有正确引用数据框中的目标列:
- 第一个
x是创建了一个名为x的新列 - 第二个
x只是函数参数的字符串值(比如"x_variable"),不是数据框里的列,相当于把字符串本身转成了因子,完全没修改到你真正要排序的x_variable列
以下是几种可行的修改方式:
方法1:使用整洁求值{{}}(推荐,tidyverse最新语法)
这种方式可以直接引用参数对应的列,调用时还能省略引号:
generate_box <- function(df, x, y) { sort_order <- c("Strongly negative", "Negative", "Neutral", "Positive", "Strongly positive") gg <- df %>% # 修改这里,用{{x}}引用目标列,:=用于动态列名 mutate({{x}} := factor({{x}}, levels = sort_order)) %>% # ggplot里也可以用{{}}替代aes_string ggplot(aes(x = {{x}}, y = {{y}}, fill = {{x}})) + geom_boxplot(outlier.size = 3, outlier.color = '#121212') return(gg) }
调用方式(无需引号):
plot <- generate_box(df, x_variable, y_variable)
方法2:使用sym()和!!(兼容字符串传参)
如果你坚持要传字符串参数,可以用sym()把字符串转成列名符号,再用!!解引用:
generate_box <- function(df, x, y) { sort_order <- c("Strongly negative", "Negative", "Neutral", "Positive", "Strongly positive") gg <- df %>% # !!x指定新列名,!!sym(x)引用目标列 mutate(!!x := factor(!!sym(x), levels = sort_order)) %>% ggplot(aes_string(x = x, y = y, fill = x)) + geom_boxplot(outlier.size = 3, outlier.color = '#121212') return(gg) }
调用方式不变:
plot <- generate_box(df, 'x_variable', 'y_variable')
方法3:使用mutate_at()(旧版tidyverse语法)
针对字符串指定的列进行修改:
generate_box <- function(df, x, y) { sort_order <- c("Strongly negative", "Negative", "Neutral", "Positive", "Strongly positive") gg <- df %>% mutate_at(vars(x), ~factor(., levels = sort_order)) %>% ggplot(aes_string(x = x, y = y, fill = x)) + geom_boxplot(outlier.size = 3, outlier.color = '#121212') return(gg) }
调用方式同样不变。
以上三种方法都能正确修改目标列的因子水平顺序,让箱线图按你指定的sort_order排列。
内容的提问来源于stack exchange,提问作者psych0groov3
相关产品推荐
相关产品推荐

