Как оценить выражения внутри mutate () - PullRequest
0 голосов
/ 05 сентября 2018

Я пытаюсь оценить выражения внутри команды mutate() и получаю ошибки. Вот как выглядит мой код прямо сейчас:

depvar <- "foo"
transformedvars[1] <- "mean(bar)"

dataset %>% mutate(paste0("t", depvar) = transformedvars[1])

Я хочу использовать mutate(), чтобы создать столбец с именем tfoo, и он будет принимать в качестве значений результат вызова mean(bar), где bar - еще один столбец в моих данных.

Я получаю ошибку:

Ошибка: неожиданно '=' в: "набор данных%>% mutate (paste0 (" t ", depvar) ="

Ответы [ 2 ]

0 голосов
/ 05 сентября 2018

Я вообще не знаю, почему вы хотите использовать здесь код Tidyverse, когда базовый код R намного понятнее:

newname <- paste0("t", depvar)
df[, newname] <- with(df, eval(parse(text = transformedvars[1])))

Все это можно сделать в одной строке как

df[, paste0("t", depvar)] <- with(df, eval(parse(text = transformedvars[1])))

но я думаю, что двухстрочную версию легче читать.

0 голосов
/ 05 сентября 2018

Для этого требуется rlang. Сначала я создаю фрейм данных:

df <- data.frame(bar = runif(10))

#            bar
# 1  0.549319057
# 2  0.351898657
# 3  0.326850457
# 4  0.951580599
# 5  0.712514111
# 6  0.425802253
# 7  0.240621368
# 8  0.002803366
# 9  0.471586186
# 10 0.387040517

Далее я указываю имя моей переменной и преобразование:

dep_var <- "foo"
tran_var <- "mean(bar)"

Наконец, я использую !!, чтобы заключить в кавычки строку, которую я создаю с paste, и проанализированную строку из parse_quosure.

df %>% mutate(!!paste("t", dep_var, sep = "") := !!parse_quosure(tran_var))

#            bar      tfoo
# 1  0.549319057 0.4420017
# 2  0.351898657 0.4420017
# 3  0.326850457 0.4420017
# 4  0.951580599 0.4420017
# 5  0.712514111 0.4420017
# 6  0.425802253 0.4420017
# 7  0.240621368 0.4420017
# 8  0.002803366 0.4420017
# 9  0.471586186 0.4420017
# 10 0.387040517 0.4420017

Редактировать

Проверяя документацию, похоже, что parse_quosure был «мягко устаревшим», поэтому следующее может быть более актуальным:

df %>% mutate(!!paste("t", dep_var, sep = "") := !!parse_quo(tran_var, env = caller_env()))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...