1

我正在编写一个函数来重新排序 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 中的两个项目。这些是列中仅有的两个字符串。此外,它确实给了我一个 tibble,其中列的内容已替换为 col_name 的字符串。

我花了很长时间才弄清楚如何使用函数中提供的参数进行变异,但我无法弄清楚 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)
}

我也尝试使用 base r 函数因子,但没有运气,因为我也无法让因子接受参数。

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

4

1 回答 1

0

假设 'col_name' 作为字符串和fact_list中的字符传递,将 'col_name' 包装在 中vector,然后在步骤中,将其转换为bol 并在 rhsmutate_atvarsmutatesym!!:=

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"
于 2020-03-26T21:31:10.437 回答