如何在str_detect函数的第一个参数中正确传入自定义变量
问题根因
你的代码无法得到预期结果有两个明确问题:
- 直接传入存储列名的字符串变量
var时,str_detect只会读取到长度为1的字符串值本身(即mtcars第一列的列名"mpg"),不会去提取数据框中对应列的所有观测值参与匹配 case_when的语法不符合要求:每个判断分支需要用~连接判断条件和对应返回值,不能直接用逗号分隔,且必须设置兜底分支,否则不满足前置条件的行会返回NA。
正确代码
当前你把列名以字符串形式存在变量里的场景,用tidyverse官方推荐的.data代词引用列即可,不需要复杂的语法转换:
library(tidyverse) # 存储目标列名的变量 var <- names(mtcars)[1] mtcars %>% mutate( new_var = case_when( str_detect(.data[[var]], "^2") ~ "two", TRUE ~ "other" ) )
补充说明
.data[[var]]是tidy eval体系中面向「字符串变量引用数据列」场景的标准写法,所有tidyverse系列函数都原生支持,兼容性最好,不需要额外做符号转换- 如果你后续需要封装自定义函数、以裸列名(不带引号的列名)作为传入参数,才需要用到
{{}}(拥抱运算符)做语法适配,当前存储列名字符串的场景用.data[[ ]]是最优选择 - 上述代码运行后,会匹配mtcars第一列mpg中所有以2开头的值,对应行的new_var赋值为"two",其余行赋值为"other"。
内容的提问来源于stack exchange,提问作者Lenn
相关产品推荐
相关产品推荐

