R语言基于交叉映射表批量实现特定案例数据重编码的方法
R语言基于交叉映射表批量重编码实现方案
该需求完全可实现,无需为每条重编码规则单独编写代码,支持任意数量的规则,仅需保证交叉映射表结构正确即可。
推荐实现方式(tidyverse 长表匹配法,逻辑清晰不易出错)
依赖加载
library(tidyverse)
核心代码
data_new <- data %>% # 将所有题目列转为长表格式 pivot_longer(cols = starts_with("Q"), names_to = "var", values_to = "origin_val") %>% # 按用户ID+变量名匹配交叉映射表 left_join(cw, by = c("su_id", "var")) %>% # 存在重编码值则用新值,否则保留原值 mutate(final_val = coalesce(newVal, origin_val)) %>% # 恢复原始宽表结构 select(su_id, var, final_val) %>% pivot_wider(names_from = var, values_from = final_val)
输出结果
运行后得到的data_new符合预期重编码要求:
# A tibble: 10 × 3 su_id Q1 Q2 <int> <dbl> <dbl> 1 100001 1 2 2 100002 2 4 3 100003 5 5 4 100004 4 4 5 100005 2 3 6 100006 3 5 7 100007 4 2 8 100008 2 1 9 100009 1 5 10 100010 4 5
轻量实现方式(基础R循环,适合小数据集)
如果不想引入tidyverse依赖,也可以直接遍历交叉映射表逐行赋值:
# 直接在原数据上修改,如需保留原数据可先复制一份:data_new <- data for(i in seq(nrow(cw))) { data[data$su_id == cw$su_id[i], cw$var[i]] <- cw$newVal[i] }
原代码问题说明
- 循环内每次都基于未修改的原始
data生成data_new,上一轮的修改结果会被完全覆盖 across的匹配逻辑没有对应到su_id+var的唯一组合,赋值逻辑混乱导致结果错误
内容的提问来源于stack exchange,提问作者Quinterpret
相关产品推荐
相关产品推荐

