我正在尝试在mutate()
命令中求值表达式,但出现错误。这是我的代码现在的样子:
depvar <- "foo"
transformedvars[1] <- "mean(bar)"
dataset %>% mutate(paste0("t", depvar) = transformedvars[1])
我想使用mutate()
创建一个名为tfoo
的列,并将调用mean(bar)
的结果作为值,其中bar
是我的另一列数据。
我得到的错误是:
错误:“:数据集%>%mutate(paste0(“ t”,depvar)=“
答案 0 :(得分:4)
这需要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()))
答案 1 :(得分:0)
当基本的R代码更加清晰时,我根本不知道为什么要在这里使用Tidyverse代码:
newname <- paste0("t", depvar)
df[, newname] <- with(df, eval(parse(text = transformedvars[1])))
可以全部用一行完成
df[, paste0("t", depvar)] <- with(df, eval(parse(text = transformedvars[1])))
但是我认为两行版本更容易阅读。