как передать переменные во вложенную функцию в dply::поперек?

#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 ты потрясающий! 🙂 Это был именно тот намек, который мне был нужен! Идея определять переменные отдельно после второй функции не пришла бы мне в голову! Спасибо за вашу быструю помощь! Топ!