Как сделать fct_drop внутри функции (используя tidy eval)? - PullRequest
0 голосов
/ 05 марта 2019

Использование набора данных diamonds ...

Попытка создать функцию, которая позволит мне наносить или вырезать, или раскрасить по оси X ...

... но сначалаЯ хочу отфильтровать выбранный столбец, чтобы показать только определенное количество уровней.

У меня работает фильтр, но уровни все еще присутствуют ... и они будут отображаться на графике.Мне нужно сделать fct_drop () для выбранного столбца

Пожалуйста, посмотрите код ниже для воспроизводимого примера:

library(tidyverse)

diamonds <- diamonds %>% 
    mutate(cut = factor(cut),
         color = factor(color))

reduce_for_plot <- function(data, column, how_many_levels) {

  column2 <- enquo(column)
  of_interest <- unique(data[[deparse(substitute(column))]])[1:how_many_levels]

  data %>%
    filter(!! column2 %in% of_interest)

  # here is where I then do some kind of mutate... to fct_drop the selected column  

  # this line seems to work
  # value_to_put_in <- fct_drop(data[[deparse(substitute(column))]])

  # but this line doesn't  
  # data <- data %>% 
    # mutate(!! column = value_to_put_in)
}

diamonds %>% 
  reduce_for_plot(color, 1)

1 Ответ

0 голосов
/ 05 марта 2019

Вы были почти там!Проблема в вашем коде в том, что R не разрешает ! на LHS =.Так что вместо этого вам нужно использовать ложный оператор :=.

reduce_for_plot <- function(data, column, how_many_levels) {
  col_expr <- enquo(column)
  col_name <- rlang::as_name(col_expr)

  of_interest <- unique(data[[col_name]])[1:how_many_levels]

  data <- data %>%
    filter(!!col_expr %in% of_interest)

  value_to_put_in <- fct_drop(data[[col_name]][of_interest])

  data %>%
    mutate(!!col_name := value_to_put_in)
}

Как видите, я заменил все deparse(substitute(column)) на as_name(enquo(column)).Однако вы можете полностью избежать этого, выполняя вычисления в контексте данных, что, я думаю, дает более приятный код:

reduce_for_plot <- function(data, column, how_many_levels) {
  column <- enquo(column)

  data %>%
    filter(!!column %in% unique(!!column)[1:how_many_levels]) %>%
    mutate(!!column := fct_drop(!!column))
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...