如何使用tidyverse的mutate将字符串作为公式使用?
用dplyr的mutate替代已弃用的mutate_实现字符串表达式计算
要复现mutate_通过字符串表达式生成新列的功能,核心是把字符串形式的表达式转换成dplyr能识别的可计算表达式,以下是两种可行方法:
方法1:使用rlang包解析表达式并注入(推荐)
利用rlang::parse_expr()将字符串解析为R表达式,再通过!!(注入运算符)将表达式传入mutate中执行,这是符合tidyverse编程范式的标准写法:
library(tidyverse) df <- tribble(~Letter, "A", "B", "C") Formula <- "ifelse(Letter == 'A', 'A', 'Not A')" # 替代mutate_的写法 New_Method <- df %>% mutate(New = !!rlang::parse_expr(Formula)) # 验证结果与原方法一致 New_Method #> # A tibble: 3 × 2 #> Letter New #> <chr> <chr> #> 1 A A #> 2 B Not A #> 3 C Not A
方法2:使用base R的eval(parse)
如果不想额外依赖rlang包,也可以用base R的组合函数直接计算字符串表达式:
New_Method_Base <- df %>% mutate(New_Base = eval(parse(text = Formula))) New_Method_Base #> # A tibble: 3 × 2 #> Letter New_Base #> <chr> <chr> #> 1 A A #> 2 B Not A #> 3 C Not A
为什么之前的尝试失败?
mutate(Expected= .data[[Formula]]):.data[[x]]的作用是通过列名字符串引用列,这里把整个表达式字符串当作列名,自然找不到对应列。mutate(Expected_Two = Updated_Formula):直接传入字符串时,dplyr只会把字符串本身赋值给新列,不会解析执行里面的逻辑。
内容的提问来源于stack exchange,提问作者Tom H
相关产品推荐
相关产品推荐

