R 对于CAT,函数中的因子重新分级和用户指定的参数

R 对于CAT,函数中的因子重新分级和用户指定的参数,r,dplyr,forcats,R,Dplyr,Forcats,我正在编写一个函数来重新排列TIBLE中的列,以便它们按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

我正在编写一个函数来重新排列TIBLE中的列,以便它们按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)
}
重新排序样本%
变异(!!列名:=fct列(列名、事实列表)
}
但是,当我调用此函数时,它会给我一条警告消息:“1:f'中的未知级别:”,然后它会给我事实列表中的两项。这是列中仅有的两个字符串。此外,它会给我返回一个TIBLE,其中列的内容已替换为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)
}
重新排序样本%
变异(!!col_name:=fct_relevel(临时、事实列表)
}
我也尝试过使用基本的r函数因子,但运气不好,因为我也不能让因子接受参数


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

假设“col\u name”作为字符串传递,并且在
mutate\u at
中作为字符
向量
,将“col\u name”包装在
vars
中,然后在
mutate
步骤中,将其转换为
sym
bol并进行计算(
!!
)在
:=

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))

   }
库(dplyr)
图书馆(供猫用)
重新订购样本%
在(变量(列名称),如.因子)%>
变异(!!col_name:=fct_relevel(!!rlang::sym(col_name),事实列表))
}

使用可复制的示例

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"
数据(iris)
级别(iris$种)
#[1] “维吉尼亚”“杂色”“刚毛”

newlvls假设“col_name”作为字符串传递,并且在
mutate_at
中作为字符
向量
传递,将“col_name”包装在
vars
中,然后在
mutate
步骤中,将其转换为
sym
bol,并在的rhs上计算(
!!

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))

   }
库(dplyr)
图书馆(供猫用)
重新订购样本%
在(变量(列名称),如.因子)%>
变异(!!col_name:=fct_relevel(!!rlang::sym(col_name),事实列表))
}

使用可复制的示例

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"
数据(iris)
级别(iris$种)
#[1] “维吉尼亚”“杂色”“刚毛”
纽尔韦尔