You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 11:35:05