Forcats, пересчет факторов и заданные пользователем аргументы в функции - PullRequest
1 голос
/ 27 марта 2020

Я пишу функцию для изменения порядка столбцов в таблице, чтобы они отображались ggplot в значимом порядке, а не в алфавитном порядке. Эта функция является частью пакета, который я пытаюсь написать, где я разрешаю разные имена столбцов для таблицы. Я хотел бы сделать что-то вроде этого:

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 »:», а затем он дает два предметы в моем списке фактов. Это единственные две строки символов в столбце. Кроме того, он возвращает мне тиббл, в котором содержимое столбца было заменено строкой 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-фактор функции безуспешно, так как не смог получить фактор для аргумента.

Надеюсь, это понятно, и спасибо за любые советы заранее.

1 Ответ

0 голосов
/ 27 марта 2020

Предполагая, что 'col_name' передается как строка, а fact_list как символ vector в mutate_at, оберните 'col_name' в vars, затем на шаге mutate преобразуйте его в sym бол и оцените (!!) по правой стороне :=

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"
...