Чтобы основываться на ответе @akrun, более идиоматический c способ сделать это - передать df
в качестве первого параметра вашей функции и указать x в качестве второго. Вы можете векторизовать функцию, поместив в нее l oop для однократного запуска для каждого элемента в x, используя rlang::syms
вместо sym
. Это также делает код короче, и вы можете добавить его в конвейер, как если бы это была функция dplyr
.
simple_func <- function(df, x)
{
for(var_name in rlang::syms(paste0("pre_", x, "_months")))
{
df <- mutate(df, !! var_name := replace_na(ifelse(x==y,1,0)))
}
df
}
Итак, теперь вы можете:
df %>% simple_fun(1:5)
#> x y pre_1_months pre_2_months pre_3_months pre_4_months pre_5_months
#> 1 0 0 1 1 1 1 1
#> 2 1 2 0 0 0 0 0
#> 3 2 4 0 0 0 0 0
#> 4 3 5 0 0 0 0 0
#> 5 4 8 0 0 0 0 0
РЕДАКТИРОВАТЬ
Следуя комментарию Лайонела Генри, а также отмечая желание ОП избегать циклов, вот единственная функция без циклов, которая может использоваться в конвейере с x
произвольной длины, и который не зависит от преобразования в символы:
simple_func <- function(df, x) {
f <- function(v) df <<- mutate(df, !!v := replace_na(ifelse(x == y, 1, 0)))
lapply(paste0("pre_", x, "_months"), f)
return(df)
}
Это работает точно так же:
df %>% simple_fun(1:10)
#> x y pre_1_months pre_2_months pre_3_months pre_4_months pre_5_months pre_6_months
#> 1 0 0 1 1 1 1 1 1
#> 2 1 2 0 0 0 0 0 0
#> 3 2 4 0 0 0 0 0 0
#> 4 3 5 0 0 0 0 0 0
#> 5 4 8 0 0 0 0 0 0
#> pre_7_months pre_8_months pre_9_months pre_10_months
#> 1 1 1 1 1
#> 2 0 0 0 0
#> 3 0 0 0 0
#> 4 0 0 0 0
#> 5 0 0 0 0