как использовать mutate для присвоения списка векторов списку новых имен переменных в r

#r #dplyr #nse

#r #dplyr #nse

Вопрос:

Я создаю функцию, которой вы предоставляете фрейм данных и вектор имен переменных, которые являются числовыми, и я хочу, чтобы он возвращал фрейм данных с соответствующей переменной для каждого числового вектора, который разбивает его на интервалы.

Я знаю, как это сделать с одной переменной, но с несколькими именами переменных я получаю «Ошибка: LHS := не может быть объединен с !!! «.

Вот воспроизводимый пример:

 library(tidyverse)

vars <- c("wt", "qsec")
new_vars <- map_chr(vars, ~ paste0(.x, "_bin"))
bins <- map(vars, ~ quantile(mtcars[,.x], na.rm = T))
result <- mtcars %>% 
  mutate(!!!new_vars := map2(vars, bins, ~ cut(mtcars[,.x], breaks = .y))) 

  

Я хочу получить mtcars, но с 2 дополнительными столбцами.
1. wt_bin — какой интервал квантилей «wt» будет соответствовать
2. qsec_bin — какой интервал квантилей «qsec» соответствует

Я знаю, что это как-то связано с !!!new_vars := , но, похоже, я не совсем понимаю проблему.

Спасибо!

Комментарии:

1. Вы пытаетесь создать один столбец?. mutate создает единственную переменную, если она не является выражением

2. Я пытаюсь создать несколько столбцов. В этом примере я пытаюсь создать 2 новых столбца.

Ответ №1:

Вы могли бы сделать это без mutate и уклониться от nse слишком:

 map2_dfc(vars, bins, ~ cut(mtcars[, .x], .y, labels = F)) %>% 
  set_names(new_vars) %>% 
  bind_cols(mtcars, .)
  

Ответ №2:

Мы можем использовать := с transmute

 library(tidyverse)
map2_dfc(vars, bins, ~
                 mtcars %>%
                       transmute(!! paste0(.x, "_bin") := 
                           cut(!! rlang::sym(.x), breaks = .y))) %>% 
                 bind_cols(mtcars,.)