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

如何在R中转换仅含0和1的DataFrame生成分类属性列

在R中转换二进制编码的分类列

这问题我经常碰到,二进制编码的分类列转成实际分类值其实很简单,核心是先明确每个V1到V21对应的原始分类分组(比如哪些列对应房间数量,哪些对应价格区间)以及每个列对应的具体类别。下面给你两种常用的解决方法,你可以根据自己的习惯选择:

第一步:先构造你的数据集

首先把你提供的样本数据读进R里,我先帮你整理成可直接运行的代码:

df <- data.frame(
  ID = 1:4,
  V1 = c(0,1,0,0),
  V2 = c(0,0,0,0),
  V3 = c(0,0,0,0),
  V4 = c(0,0,1,1),
  V5 = c(1,0,1,0),
  V6 = c(0,0,0,1),
  V7 = c(0,0,0,0),
  V8 = c(0,0,0,0),
  V9 = c(1,1,0,0),
  V10 = c(0,1,0,0),
  V11 = c(1,0,1,1),
  V12 = c(0,0,0,1),
  V13 = c(0,0,0,0),
  V14 = c(0,0,0,0),
  V15 = c(0,0,1,0),
  V16 = c(1,1,1,0),
  V17 = c(1,0,0,1),
  V18 = c(0,0,0,0),
  V19 = c(0,1,1,1),
  V20 = c(0,0,0,0),
  V21 = c(1,1,0,0)
)

方法一:用Base R快速处理(适合简单场景)

假设我们已经知道:

  • V1-V4分别对应1间房、2间房、3间房、4间房
  • V5-V8分别对应低价、中价、高价、超高价

我们可以用apply()函数逐行提取每个分组中值为1的列对应的类别:

生成房间数量列

# 每行在V1-V4中找到值为1的列,提取对应的房间数量
df$room_count <- apply(df[, paste0("V", 1:4)], 1, function(x) {
  # 处理异常情况:如果没有1或者多个1,返回NA
  idx <- which(x == 1)
  if(length(idx) == 1) idx else NA
})

生成价格区间列

# 定义价格标签
price_labels <- c("低价", "中价", "高价", "超高价")
df$price_range <- apply(df[, paste0("V", 5:8)], 1, function(x) {
  idx <- which(x == 1)
  if(length(idx) == 1) price_labels[idx] else NA
})

方法二:用Tidyverse工具重塑数据(适合复杂分组场景)

如果你习惯用dplyr和tidyr这类工具,通过数据重塑的方式更直观,也更容易扩展到多个分类分组:

首先加载需要的包:

library(dplyr)
library(tidyr)

提取房间数量

# 先筛选房间相关的列,转成长格式,过滤出值为1的行,再提取房间数量
room_data <- df %>%
  select(ID, V1:V4) %>%
  pivot_longer(cols = -ID, names_to = "room_col", values_to = "value") %>%
  filter(value == 1) %>%
  mutate(room_count = as.integer(sub("V", "", room_col))) %>%
  select(ID, room_count)

# 合并回原始数据框
df <- df %>% left_join(room_data, by = "ID")

提取价格区间

# 同样处理价格相关列,用case_when映射标签
price_data <- df %>%
  select(ID, V5:V8) %>%
  pivot_longer(cols = -ID, names_to = "price_col", values_to = "value") %>%
  filter(value == 1) %>%
  mutate(price_range = case_when(
    price_col == "V5" ~ "低价",
    price_col == "V6" ~ "中价",
    price_col == "V7" ~ "高价",
    price_col == "V8" ~ "超高价"
  )) %>%
  select(ID, price_range)

df <- df %>% left_join(price_data, by = "ID")

关键注意事项

  • 你必须明确每个V列对应的原始分类规则,比如哪些列属于同一分类组,每个列对应什么具体类别——这是转换的前提。
  • 如果数据中存在某行在一个分组里有多个1或者没有1的情况,记得在代码里加上异常处理(比如返回NA或者标记为异常),避免后续分析出错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:25:08