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

如何在R中将分类特征数据框转换为二进制数据框?

R代码:分类特征转二进制矩阵(支持多行保留/单行合并+NA处理)

带NA的示例数据

首先准备包含NA的测试数据,模拟真实场景:

categorical_data <- data.frame(
  station = rep(1:3, each = 3),
  trait1 = c("TraitA", "TraitB", NA, "TraitC", "TraitA", "TraitB", NA, "TraitC", "TraitA"),
  trait2 = rep(c("TraitX", "TraitY", "TraitZ"), times = 3),
  trait3 = c("TraitM", NA, "TraitO", "TraitM", "TraitN", NA, "TraitM", "TraitN", "TraitO")
)

需求1:保留每个station的多条目,对应特征的0/1标识

该方案保留原数据的每行结构,每行的二进制列标记当前行是否包含该特征(NA会被忽略,不标记为有效特征):

library(tidyverse)

binary_multi_row <- categorical_data %>%
  # 添加临时行号,确保转宽后保留原行顺序
  mutate(row_id = row_number()) %>%
  # 将所有trait列转为长格式,方便统一处理
  pivot_longer(cols = starts_with("trait"), names_to = "trait_col", values_to = "feature") %>%
  # 过滤NA值,避免无效特征干扰
  filter(!is.na(feature)) %>%
  # 标记特征存在为1
  mutate(value = 1) %>%
  # 转回宽格式,未出现的特征填充为0
  pivot_wider(names_from = feature, values_from = value, values_fill = 0) %>%
  # 调整列顺序,移除临时字段
  select(station, everything(), -row_id, -trait_col)

# 查看结果
print(binary_multi_row)

需求2:将每个station合并为单行,标记特征是否存在

该方案按station合并所有条目,二进制列标记该station是否曾出现过该特征(只要有一行包含该特征就标1,否则0):

binary_single_row <- categorical_data %>%
  # 转换为长格式,统一处理所有特征列
  pivot_longer(cols = starts_with("trait"), names_to = "trait_col", values_to = "feature") %>%
  # 过滤NA值
  filter(!is.na(feature)) %>%
  # 去重,确保每个station的每个特征只记录一次
  distinct(station, feature) %>%
  # 标记特征存在为1
  mutate(value = 1) %>%
  # 转回宽格式,未出现的特征填充为0
  pivot_wider(names_from = feature, values_from = value, values_fill = 0) %>%
  # 按station排序,保证输出顺序一致
  arrange(station)

# 查看结果
print(binary_single_row)

关键说明

  • 用pivot_longer统一转换所有trait列,避免重复处理单个特征列
  • filter(!is.na(feature))直接过滤NA,确保无效值不会被当作特征
  • values_fill = 0自动为未出现的特征填充0,无需额外处理空值
  • 需求1中添加row_id是核心,保证转宽后不会合并原数据的行

内容的提问来源于stack exchange,提问作者Ole Brodnicke

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 04:41:03