R中按objid分组通过mutate实现CASE WHEN条件判断生成新列的方法咨询
R语言多表关联批量条件判断实现方案
实现思路
- 先通过左连接将每个objid对应的参考阈值匹配到主表,无需单独分组关联,性能更高
- 批量对所有指标列做条件判断,逻辑值直接转整数即可得到0/1标记,无需编写重复的条件语句
- 自动按要求生成新列名,支持扩展更多指标列无需修改代码逻辑
完整实现代码
首先加载依赖包:
library(dplyr)
主处理代码:
result <- data_1 %>% # 按objid关联参考阈值表 left_join(data_2, by = "objid") %>% # 批量生成标记列 mutate(across(c(x1, x2, x3), ~ as.integer(. <= .data[[paste0(cur_column(), "_r")]]), .names = "{col}_r_fin"))
如果需要移除中间的x1_r/x2_r/x3_r列,可以在代码末尾加一行select(-ends_with("_r"))即可。
如果使用1.0.0以前的旧版本dplyr,可以使用mutate_at写法:
result <- data_1 %>% left_join(data_2, by = "objid") %>% mutate_at(vars(x1, x2, x3), list(r_fin = ~ as.integer(. <= .data[[paste0(cur_column(), "_r")]])))
输出样例
最终输出结果结构如下:
| objid | x1 | x2 | x3 | x1_r | x2_r | x3_r | x1_r_fin | x2_r_fin | x3_r_fin |
|---|---|---|---|---|---|---|---|---|---|
| 1 | 7 | 5 | 6 | 1.54 | 1.14 | 1.58 | 0 | 0 | 0 |
| 2 | 4 | 2 | 2 | 0.23 | 1.23 | 0.23 | 0 | 0 | 0 |
| 3 | 4 | 8 | 3 | 1.32 | 9.32 | 7.32 | 0 | 1 | 1 |
| 4 | 9 | 9 | 4 | 11.66 | 1.26 | 7.66 | 1 | 0 | 1 |
| 4 | 2 | 1 | 2 | 11.66 | 1.26 | 7.66 | 1 | 1 | 1 |
| 2 | 5 | 3 | 2 | 0.23 | 1.23 | 0.23 | 0 | 0 | 0 |
| 4 | 8 | 2 | 7 | 11.66 | 1.26 | 7.66 | 1 | 0 | 1 |
内容的提问来源于stack exchange,提问作者user7446890
相关产品推荐
相关产品推荐

