У меня есть настраиваемая функция, которая суммирует переменную. Я упростил функцию, чтобы проиллюстрировать свою проблему, т. е. она сложнее, чем показано ниже. Обратите внимание, что общая структура функции должна оставаться неизменной: она принимает аргумент для указания, с каким фреймом данных работать (df
), и аргумент, переменную для суммирования (variable_to_test
).
my_fun <- function(df, variable_to_test) {
variable_to_test <- enquo(variable_to_test)
new_var_name <- paste0(quo_name(variable_to_test), "_new_name")
df %>%
summarise(
!!new_var_name := sum(!!variable_to_test, na.rm = TRUE)
)
}
Используя пример, я могу применить функцию к каждой переменной в моем фрейме данных:
library(tidyverse)
dat <- tibble(
variable_1 = c(1:5, NA, NA, NA, NA, NA),
variable_2 = c(NA, NA, NA, NA, NA, 11:15)
)
> my_fun(dat, variable_1)
# A tibble: 1 x 1
variable_1_new_name
<int>
1 15
> my_fun(dat, variable_2)
# A tibble: 1 x 1
variable_2_new_name
<int>
1 65
Но: как я могу применить эту функцию ко всем столбцам в фрейме данных? Я пытался
> dat %>%
+ lapply(., my_fun)
Error in duplicate(quo) : argument "quo" is missing, with no default
Called from: duplicate(quo)
но это возвращает ошибку. Я борюсь с тем фактом, что функция принимает аргумент как для фрейма данных, так и для переменной для суммирования. Обратите внимание, что я хотел бы сохранить эту структуру - я считаю более элегантным передать имя фрейма данных в функцию вместо того, чтобы просто давать функции имя переменной и «жестко закодировать» фрейм данных в теле функции. Кто-нибудь знает, как lapply()
эту функцию?
dplyr
решение, или base R соответствует вашим потребностям? Обычно вы решаете эту проблему, предоставляя функции один статический и один переменный вход, напримерlapply(dat, function(x) myfun(dat, x))
. Я не разбираюсь вdplyr
, но может попробоватьlapply(., function(x) myfun(., x))
? - person LAP   schedule 14.08.2017tidyeval
-способом, так как это улучшает читаемость тела функции. Так что да, мне нужноtidyeval
-решение :) - person piptoma   schedule 14.08.2017