如何在dplyr 0.7.2中将字符串形式的表达式传递给动词?
解决dplyr下划线函数中mutate变量名异常的问题
嘿,我明白你遇到的麻烦了——用mutate_()生成新变量时,结果的变量名居然是整个表达式字符串gear_carb = gear*carb,而不是你想要的gear_carb对吧?这是因为旧版的下划线系列函数(filter_()、mutate_()这些)在处理赋值逻辑时,和filter_()的逻辑表达式解析规则不一样,直接传完整的赋值字符串会被当作变量名处理。
下面给你两种可行的解决办法,顺便推荐更现代的dplyr写法:
方法1:改用现代tidy eval语法(推荐)
下划线函数已经被dplyr官方弃用了,现在更推荐结合rlang的表达式解析和注入语法来实现动态表达式:
library(tidyverse) library(rlang) data(mtcars) # 先把字符串解析成表达式 filter_expr = parse_expr("am == 1") mutate_expr = parse_expr("gear_carb = gear*carb") select_expr = parse_expr("mpg , cyl") # 用!!注入表达式到现代dplyr函数中 mtcars %>% filter(!!filter_expr) %>% mutate(!!mutate_expr) %>% select(!!select_expr)
这样运行后,新变量就会正确命名为gear_carb,而且代码也符合当前dplyr的最佳实践。
方法2:适配旧版下划线函数的写法
如果你一定要沿用mutate_(),需要用.dots参数配合命名列表来明确变量名和计算逻辑:
library(tidyverse) library(rlang) data(mtcars) filter_expr = "am == 1" mutate_expr = "gear*carb" # 只保留计算逻辑 select_expr = "mpg , cyl" mtcars %>% filter_(filter_expr) %>% mutate_(.dots = setNames(list(parse_expr(mutate_expr)), "gear_carb")) %>% select_(select_expr)
这里用setNames()把计算表达式和目标变量名绑定,mutate_()就能正确识别哪个是变量名、哪个是计算逻辑了。
内容的提问来源于stack exchange,提问作者user8270077
相关产品推荐
相关产品推荐

