Скажімо, я хочу додати 1 до кожного значення стовпця за допомогою dplyr
і стандартне оцінювання.
Я можу зробити :
library(dplyr)
data <- head(iris)
var <- "Sepal.Length"
mutate(data, !!rlang::sym(var) := !!quo(`+`(!!rlang::sym(var), 1)))
Але що робити, якщо я хотів би скористатися +
як бінарний оператор, а не як функція? Я не можу зрозуміти, як писати +
із символом у квасурі. У більшості своїх спроб я отримав помилку за спробу використання нечислового аргументу (наприклад, символу) з двійковим оператором +
.
З застарілим mutate_
ви можете використовувати lazyeval::interp
що дозволило вам зробити це легко:
mutate_(data, .dots = setNames(list(lazyeval::interp(~var + 1, var = as.symbol(var))), var))
Будь-яка допомога буде вдячна. Дякую.
Відповіді:
3 для відповіді № 1Ви можете просто використовувати
mutate(data, !!rlang::sym(var) := (!!rlang::sym(var)) + 1)
Зверніть увагу на дужки навколо частини чубчика. Це необхідно лише тому, що ви, ймовірно, використовуєте старішу версію rlang. У старих версіях (<0,2) !!
має дуже низький пріоритет, тому додавання відбувається перед розширенням. Починаючи з rlang 0,2 the !!
має інший пріоритет оператора і працює більше, як ви могли очікувати.
Звичайно, якщо ви застосовуєте одне і те ж перетворення на купу стовпців, ви можете скористатися mutate_at
, mutate_all
, або mutate_if
версії, які також дозволяють перетворенням бути специфічними з синтаксисом формули.
mutate_if(data, is.numeric, ~.x+1)
mutate_all(data, ~.x+1)
mutate_at(data, var, ~.x+1)