dplyr summarise_at не может найти дополнительные переменные внутри объекта функции - PullRequest
0 голосов
/ 01 ноября 2018

Я хочу использовать dplyr::summarise_at для коллекции столбцов с функциональным объектом, который использует дополнительную переменную.

Например, рассмотрим следующий кадр данных с двумя числовыми переменными и индикатором.

library(dplyr, warn.conflicts = FALSE)

t1 <- data.frame(lg = c(TRUE, FALSE, TRUE, FALSE),
                 x1 = 1:4,
                 x2 = 5:8)

Использование dplyr::funs() внутри summarise_at работает:

t1 %>% summarise_at(c("x1", "x2"), funs(mean(. * lg)))
#>   x1 x2
#> 1  1  3

Однако я предпочитаю передавать объект function в summarise_at - вместо вызова dplyr::funs() - чтобы R CMD Check не жаловался на неизвестную переменную ..

К сожалению, когда я пытаюсь это сделать, summarise_at не может найти переменную индикатора lg.

t1 %>% summarise_at(c("x1", "x2"), function(x) mean(x * lg))
#> Error in summarise_impl(.data, dots): Evaluation error: object 'lg' not found.

Следовательно, есть ли способ передать объект функции в summarise_at с дополнительными переменными внутри объекта функции таким образом?

1 Ответ

0 голосов
/ 02 ноября 2018

Я не думаю, что это можно сделать без использования funs или list внутри summarize_at(). Я предполагаю, что когда мы используем тильду ~ & . / .x или аналогично function(x) & x, она создает анонимную функцию со своей собственной средой. Таким образом, он знает только о переменной столбца, которая передается через . или .x, но не о другой переменной во фрейме данных, т.е. lg. Принимая во внимание, что когда мы добавляем funs() или list(), он, вероятно, наследует всю среду, что делает его осведомленным о каждом столбце внутри фрейма данных, а не только о том, который был передан через .

Если вам нужен более понятный код, возможно, напишите функцию, а затем вызовите ее внутри summarise_at()?

multiplyx <- function(x, lg){
  result <- mean(x * lg)
  return(result)
}

t1 %>% summarise_at(c("x1", "x2"), funs(multiplyx(., lg)))
#>   x1 x2
#> 1  1  3

t1 %>% summarise_at(c("x1", "x2"), list(~ multiplyx(., lg)))
#>   x1 x2
#> 1  1  3

См. Также this

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