R语言如何高效创建因子数值转换映射字典/参考表
R批量生成因子转换映射字典表方案
- 测试数据集构造
col_1 = as.factor(c("a", "a", "b", "c", "b", "a")) col_2 = c(15, 346, 3564, 99, 10, 2) col_3 = as.factor(c("bb", "a", "g", "f", "bb", "a")) index = 1:6 # 转换前务必备份原始数据集,避免因子标签丢失 original_data = data.frame(index, col_1, col_2, col_3) sample_data = original_data
原始数据集预览:
| index | col_1 | col_2 | col_3 |
|---|---|---|---|
| 1 | a | 15 | bb |
| 2 | a | 346 | a |
| 3 | b | 3564 | g |
| 4 | c | 99 | f |
| 5 | b | 10 | bb |
| 6 | a | 2 | a |
- 已实现的批量因子转数值逻辑
# 识别数据集中所有因子列 indx <- vapply(sample_data, is.factor, logical(1)) vec <- interaction(stack(type.convert(sample_data[,indx], as.is = TRUE))) sample_data[indx] <- match(vec, unique(vec))
转换后数据集预览:
| index | col_1 | col_2 | col_3 |
|---|---|---|---|
| 1 | 1 | 15 | 4 |
| 2 | 1 | 346 | 5 |
| 3 | 2 | 3564 | 6 |
| 4 | 3 | 99 | 7 |
| 5 | 2 | 10 | 4 |
| 6 | 1 | 2 | 5 |
- 待解决问题
需要生成原始因子值与转换后数值的映射字典表,之前手动逐列提取映射再用plyr::rbind.fill合并的方式效率极低,适配大量因子列时操作成本过高,需要通用自动化实现方案。手动实现的参考输出效果如下:
| original_data.col_1 | sample_data.col_1 | original_data.col_3 | sample_data.col_3 |
|---|---|---|---|
| a | 1 | NA | NA |
| b | 2 | NA | NA |
| c | 3 | NA | NA |
| NA | NA | bb | 4 |
| NA | NA | a | 5 |
| NA | NA | g | 6 |
| NA | NA | f | 7 |
通用实现代码
通过遍历所有因子列批量提取唯一映射关系,再自动合并为完整字典表,无需手动指定列名,适配任意数量的因子列,仅用base R即可完成,不需要依赖第三方包:
# 提取所有因子列名 factor_cols <- names(which(indx)) # 逐列生成原始值-转换值映射表 map_list <- lapply(factor_cols, function(col){ tmp <- unique(data.frame( orig = original_data[[col]], trans = sample_data[[col]] )) names(tmp) <- c(paste0("original_", col), paste0("transformed_", col)) tmp$merge_id <- seq_len(nrow(tmp)) return(tmp) }) # 合并所有映射表得到最终字典 dictionary_data <- Reduce( f = function(x,y) merge(x, y, by = "merge_id", all = TRUE), x = map_list ) dictionary_data$merge_id <- NULL
运行输出的字典表和手动实现效果完全一致,即使数据集中有数十上百个因子列也可以一键生成。
内容的提问来源于stack exchange,提问作者stats_noob
相关产品推荐
相关产品推荐

