求助:如何在dplyr的case_when中通过变量动态选择列
在dplyr的case_when中动态选择列的解决办法
你遇到的问题是因为case_when()的表达式解析特性,直接用!!sym(col)无法在分支里正确识别动态列名,以下是两种可行的解决方式:
方式一:使用.data代词(推荐)
.data是tidyverse官方推荐的动态引用列的工具,能直接在case_when()的分支里通过字符串变量选取列:
col = "cyl" mtcars %>% mutate(new_col = case_when(.data[[col]] == 6 ~ "Standard", TRUE ~ "Sample"))
方式二:使用rlang::eval_tidy()
如果需要用符号引用的方式,可以借助rlang包的eval_tidy()函数来解析动态列:
library(rlang) col = "cyl" mtcars %>% mutate(new_col = case_when(eval_tidy(sym(col)) == 6 ~ "Standard", TRUE ~ "Sample"))
补充说明
之前用!!sym(col)失效的原因是:case_when()的每个条件分支是独立的表达式环境,!!的非标准求值无法穿透到分支内部;而.data代词是直接在数据框的上下文里引用列,不会受这个限制。
内容的提问来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

