R如何基于向量存储的列名在mutate的case_when中完成变量转换
R dplyr动态调用存储在变量中的列名的解决方法
问题根因
你代码生成的var2全为NA的核心原因是:存储在var1中的是列名字符串,直接在case_when中调用时,R会将其识别为普通文本字符串而非数据框对应的列,字符串与数值比较的结果永远为FALSE,无法命中任何case_when的分支,最终全为NA。同时你用到的select_、mutate_这类下划线结尾的函数属于dplyr已弃用的旧接口,也容易出现兼容问题。
正确实现代码
现在推荐使用dplyr整洁评估语法实现动态列操作,代码如下:
library(dplyr) var1 = "transfer" var2 = "transfer_tier" tier <- trx %>% select(all_of(var1)) %>% mutate( !!var2 := case_when( .data[[var1]] <= 1e3 ~ '1. <1k', .data[[var1]] <= 1e4 ~ '2. <10k', # 可选:补充超出10k的分支,避免对应区间的记录返回NA TRUE ~ '3. >=10k' ) )
关键语法说明
all_of(var1):dplyr官方推荐的动态选列语法,接收字符向量匹配列名,比旧接口select_更安全.data[[var1]]:.data代词指向当前管道传入的数据框,通过双括号传入字符串列名即可调用对应列的实际值!!var2 :=:动态生成新列名的语法,!!用于注入变量值,:=替代普通的=实现变量作为列名的赋值操作
注:你原代码中两个分组的前缀序号均为
1.,会导致后续因子排序异常,建议调整为不同序号区分分组。
内容的提问来源于stack exchange,提问作者Anshari
相关产品推荐
相关产品推荐

