Удалить группировку var в пользовательской функции - PullRequest
0 голосов
/ 21 февраля 2019

Я пытаюсь написать функцию, которая корректирует группирующие переменные, чтобы исключить одну группировочную переменную.В функцию всегда передается групповой тибл.Первая часть функции выполняет некоторые вычисления на уровне группировки, который она предоставляет.Вторая часть выполняет дополнительные вычисления, но должна исключить единую переменную группировки, которая является динамической в ​​моих данных.Использование mtcars в качестве примера набора данных:

library(tidyverse)

# x is a grouped tibble, my_col is the column to peel
my_function <- function(x, my_col){

    my_col_enc <- enquo(my_col)

    # Trying to grab the groups and then peel off the column
    x_grp <- x %>% group_vars()
    excluded <- x_grp[!is.element(x_grp, as.character(my_col_enc))]

    # My calculations are two-tiered as described in the original description
    # simplifying for example
    x %>% group_by(excluded) %>% tally()

}

# This should be equivalent to mtcars %>% group_by(gear) %>% tally()
mtcars %>% group_by(cyl, gear) %>% my_function(cyl)

Когда я запускаю это, я получаю сообщение об ошибке: столбец «исключен» неизвестен.

Редактировать: Для любых будущих искателей с этой проблемой, если у вас есть символьный вектор (то есть несколько группирующих переменных), вам может понадобиться использовать символы с !!!чтобы добиться того, о чем просил мой оригинальный вопрос.

1 Ответ

0 голосов
/ 21 февраля 2019

Вот то, что вы ищете:

  library(tidyverse)

  my_function <- function(x, my_col){

    my_col_enc <- enquo(my_col)

    # Trying to grab the groups and then peel off the column
    x_grp <- x %>% group_vars()

    # here, make sure this is a symbol, else it'll group as character later (e.g. 'gear')
    excluded <- rlang::sym(x_grp[!is.element(x_grp, as.character(my_col_enc))])

    # need to use !'s to deal with the symbol
    x %>% group_by(!!excluded) %>% tally()
  }

Я прокомментировал код, но первая проблема заключалась в том, что ваша переменная excluded не была распознана: чтобы сделать косвенные ссылки на столбцы,необходимо изменить код в кавычках, прежде чем он будет оценен.Сделайте это с помощью оператора !! (произносится как «bang bang»).

Добавление только этого к вашему коду не решит полностью, потому что excluded является символом.Он должен рассматриваться как символ, поэтому функция rlang::sym() оборачивает его объявление.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...