在R语言中为数据框各列唯一值分配0/1/2标识并保留NA
问题描述
现有一个多列数据框,每列包含3种可能的取值(不同列的唯一值不重复),部分列存在NA值。示例数据如下:
df = data.frame( "a" = c(13, 33, 11, 33), "b" = c(11, 11, 14, 11), "c" = c(44, 22, NA, 24) )
需要将每列的每个唯一值映射为0、1、2中的一个:要求每列里有且仅有一个值被标记为1,另外两个值分别标记为0和2(同一列内映射规则统一),同时保留原数据中的NA值。期望输出如下:
a b c 1 1 0 0 2 2 0 2 3 0 1 NA 4 2 0 1
解决方案
随机分配映射规则
如果不需要指定哪一个值对应1,仅随机分配标识,可使用以下代码:
# 定义单列处理函数 map_single_col <- function(col) { # 提取列中非NA的唯一值 unique_vals <- unique(col[!is.na(col)]) # 随机生成0、1、2的映射,每个值对应一个 set.seed(123) # 可选,固定随机结果,保证每次运行输出一致 value_map <- sample(c(0, 1, 2), 3, replace = FALSE) names(value_map) <- unique_vals # 替换原列值,自动保留NA mapped_col <- value_map[as.character(col)] # 转换为数值类型 as.numeric(mapped_col) } # 应用到数据框所有列 result_df <- as.data.frame(lapply(df, map_single_col)) print(result_df)
指定规则分配映射
如果需要按特定规则(比如将列中最小的值设为1),可修改映射逻辑:
map_single_col <- function(col) { unique_vals <- unique(col[!is.na(col)]) # 按值从小到大排序,第一个设为1,其余分配0和2 sorted_vals <- sort(unique_vals) value_map <- c(1, 0, 2) names(value_map) <- sorted_vals mapped_col <- value_map[as.character(col)] as.numeric(mapped_col) } result_df <- as.data.frame(lapply(df, map_single_col))
说明
- 处理函数会自动识别列中的非NA唯一值,生成对应映射后替换原数据,NA值会被保留。
- 若有其他映射需求(比如将出现次数最多的值设为1),只需调整
value_map的生成逻辑即可。
内容的提问来源于stack exchange,提问作者Evelyn Abbott
相关产品推荐
相关产品推荐

