Я пытаюсь создать очень программный фрагмент кода, который позволяет мне получать модельные переменные на основе формулы модели, которую я отправляю в функцию.Некоторые из функций, которые мне нужны, должны быть рассчитаны на лету.Я не могу понять, как сделать некоторые из них.Я почти на месте, но мне нужно выяснить это немного.Вот мое представление:
Давайте возьмем набор данных mtcars
.Теперь, как я это настроил, я программно определил некоторые функции, которые я хочу сделать новыми столбцами.Например, это работает:
# everything below I've defined programmatically:
cyl_lag_2 <- function(x) lag(x, 2)
cyl_lag_3 <- function(x) lag(x, 3)
lag_model_vars <- c("cyl_lag_2", "cyl_lag_3")
stem_col <- function(.f, ...) .f(...)
# here I apply these to the dataset by hard-coding the lag column in two ways
# this works
mtcars %>%
mutate_at(lag_model_vars, funs(stem_col(., cyl)))
# also this does
mtcars %>%
mutate_at(lag_model_vars, funs(stem_col(., .data[["cyl"]])))
Но у меня вопрос: а что если я хочу, чтобы он ссылался на несколько столбцов?Например:
# everything below I've defined programmatically:
cyl_lag_2 <- function(x) lag(x, 2)
hp_lag_3 <- function(x) lag(x, 3)
lag_model_vars <- c("cyl_lag_2", "hp_lag_3")
lag_cols <- sub("(.*?)_(.*)", "\\1", c("cyl_lag_2", "hp_lag_3"))
stem_col <- function(.f, ...) .f(...)
# this does not work at all
mtcars %>%
mutate_at(lag_model_vars, funs(stem_col(., .data[[lag_cols]])))
# nor this
mtcars %>%
mutate_at(lag_model_vars,
funs(stem_col(., .data[[sub("(.*?)_(.*)", "\\1", expr(.))]])))
Идеи?Я чувствую, что я рядом.Решение также должно работать, если входящий фрейм данных сгруппирован, поэтому обращение к mtcars
недопустимо.
mtcars %>%
mutate_at(lag_model_vars, funs(stem_col(., mtcars[[lag_cols]])))