#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,.)