如何在dplyr的mutate中利用字符向量表达式创建多个变量?
解决方法:在mutate中使用预存的字符串表达式创建新变量
这个问题挺常见的——当你想把预先定义好的表达式存在变量里再传给mutate时,直接传入字符串肯定不行,因为mutate会把它当成一个普通的变量名来处理。这里有两种靠谱的解决方法,推荐第一种更符合tidyverse风格的方案:
方法1:使用rlang的解析函数(推荐)
tidyverse生态里的rlang包提供了专门处理表达式的工具,我们可以先把字符串解析成R能识别的表达式,再传入mutate:
library(dplyr) library(rlang) data(mtcars) newVariables <- "x = hp + gear, y = ((drat + wt) / carb)" # 把字符串解析为表达式列表 expr_list <- parse_exprs(newVariables) # 用!!!(unquote-splice)把表达式展开传入mutate mtcars_with_new_vars <- mtcars %>% mutate(!!!expr_list) # 查看结果 head(mtcars_with_new_vars)
原理说明:
parse_exprs()会把你的字符串拆分成两个独立的赋值表达式(x = hp + gear和y = ((drat + wt) / carb)),转换成R能理解的表达式对象列表。!!!是tidy eval里的“解引用拼接”操作符,它会把列表里的每个表达式直接展开到mutate的参数中,效果和你手动写mutate(x = hp + gear, y = ((drat + wt) / carb))完全一样。
方法2:使用base R的eval(parse())
如果你不想额外加载rlang,也可以用base R的组合工具,但这种方法在tidyverse工作流里不算最优选择(安全性和可读性稍差):
library(dplyr) data(mtcars) newVariables <- "x = hp + gear, y = ((drat + wt) / carb)" mtcars_with_new_vars <- mtcars %>% mutate(eval(parse(text = newVariables)))
原理说明:
parse(text = newVariables)把字符串转换成表达式,eval()则执行这个表达式,最终在mutate里生成对应的新变量。
内容的提问来源于stack exchange,提问作者Mislav
相关产品推荐
相关产品推荐

