如何计算mutate()

时间:2018-09-05 13:10:24

标签: r dplyr

我正在尝试在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 :(得分: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])))

但是我认为两行版本更容易阅读。