#r #dplyr #nested-function #across
Вопрос:
Я пытаюсь рассчитать скользящую корреляцию между несколькими столбцами в кадре данных. Я хотел бы использовать dplyr::across
, но переменные (имя столбца) не найдены:
df <- dplyr::tibble(
"a" = runif(1000, min=-2, max=2),
"b" = runif(1000, min=-2, max=2),
"c" = runif(1000, min=-2, max=2),
"d" = runif(1000, min=-2, max=2)
)
df %>%
dplyr::mutate(dplyr::across(
.cols = c("c","d"),
# the correlation should always be calculated against "a"
.fns = ~tibbletime::rollify(stats::cor(get("a"),.x), window = 100),
.names = "{col}_corr"))
Я получаю ошибку:
Ошибка: Проблема с
mutate()
вводом..1
. i..1 = dplyr::across(...)
. x..1
должен быть вектором, а не функцией.
при любом изменении .fns
формулы, которую я пробовал .x
, она не распознается. Не могли бы вы помочь мне, пожалуйста, как передать переменную x во вложенную функцию?
Комментарии:
1. У вас есть пример того, как должен выглядеть результат? Я не уверен, что в конечном итоге получу правильный ответ. Мне было трудно совместить синтаксис формулы
rollify()
с синтаксисом формулыacross()
. Но если я создам функциюcorr_roll()
внеacross()
, как показано вrollify()
разделе «Примеры»,cor_roll = tibbletime::rollify(~cor(.x, .y), window = 100)
а затем использую ее внутриacross()
.fns = ~cor_roll(a, .x),
, она, по крайней мере, что-то вернет.2. Хорошо, не делая
corr_roll()
отдельно, возможно, ваша функция вacross()
может выглядеть так.fns = ~tibbletime::rollify(~cor(.x, .y), window = 100)(a, .x)
. Похоже, он возвращает то же самое, что и двухэтапный процесс, но код кажется немного сложным для понимания. Все еще не уверен, что возвращает то, что вы ожидаете.3. @aosmith ты потрясающий! 🙂 Это был именно тот намек, который мне был нужен! Идея определять переменные отдельно после второй функции не пришла бы мне в голову! Спасибо за вашу быструю помощь! Топ!