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
作为字符 vector
在 mutate_at
中传递,将 'col_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))
}
使用可重现的例子
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"
我正在编写一个函数来重新排列 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
作为字符 vector
在 mutate_at
中传递,将 'col_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))
}
使用可重现的例子
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"