Forcats,因子重新调整和用户在函数中指定的参数

Forcats, factor releveling and user specified arguments in a function

我正在编写一个函数来重新排列 tibble 中的列,以便 ggplot 按有意义的顺序绘制它们,而不是按字母顺序排列。此函数是我正在尝试编写的包的一部分,我在其中允许为 tibble 使用不同的列名。我想做这样的事情:

reorder_samples <- function(tibble, col_name, fact_list)
{
    #where col_name is a string which is the title of the column to be factored 
    #and fact_list is a concatenated list of strings in the order I want for the factors
    factored_tibble <- tibble %>%
        mutate_at(col_name, as.factor) %>%
        mutate(!!col_name := fct_relevel(col_name, fact_list)
}

但是,当我调用此函数时,它会给我一条警告消息:“1:'f' 中的未知级别:”然后它会在我的 fact_list 中给出两个项目。这是列中仅有的两个字符串。此外,它确实给了我一个提示,其中列的内容已替换为 col_name.

的字符串

我花了很长时间才弄清楚如何让 mutate 使用我的函数中提供的参数,但我一直无法弄清楚 forcats 的语法应该是什么,所以它意识到我指的是到列名。如果我将列名直接替换为它有效的代码:

reorder_samples <- function(tibble, col_name, fact_list)
{
    factored_tibble <- tibble %>%
        mutate_at(col_name, as.factor) %>%
        mutate(!!col_name := fct_relevel(Temp, fact_list)
}

我也尝试过使用基本的 r 函数 factor 但没有成功,因为我也无法得到 factor 来接受参数。

希望这是清楚的,感谢您提前提出任何建议。

假设 'col_name' 作为字符串传递,fact_list 作为字符 vectormutate_at 中传递,将 'col_name' 包装在 vars,然后在 mutate 步骤中,将其转换为 symbol 并在 :=

的右侧计算 (!!)
library(dplyr)
library(forcats)
reorder_samples <- function(tibble, col_name, fact_list){

  tibble %>%
    mutate_at(vars(col_name), as.factor) %>%
    mutate(!!col_name := fct_relevel(!! rlang::sym(col_name), fact_list))

   }

使用可重现的例子

data(iris)
levels(iris$Species)
#[1] "setosa"     "versicolor" "virginica" 

newlvls <- c("virginica", "setosa", "versicolor")
out <- reorder_samples(iris, "Species", newlvls)
levels(out$Species)
#[1] "virginica"  "setosa"     "versicolor"