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

如何创建含重复ID的虚拟变量数据集?R语言实操需求

R语言分组创建存在型虚拟变量

原始数据

df = data.frame(ID = rep(1:3,each=5),
                group = c('A','B','A','A','C','B','D','C','B','A','A','B','B','A','C') )

需求说明

按ID分组,为A、B、C、D四个类别创建虚拟变量:只要某ID对应的group中出现过该类别,对应列取值为1,无需考虑该类别在组内是否重复出现,最终输出格式如下:

ID A B C D
1  1 1 1 1 0
2  2 1 1 1 1
3  3 1 1 1 0

解决方案

方法1:tidyverse组合(dplyr + tidyr)

这是直观的tidy风格写法,先去重保留每个ID下出现过的类别,再转宽格式补全缺失值:

library(dplyr)
library(tidyr)

df_result <- df %>%
  distinct(ID, group) %>%  # 保留每个ID下的唯一group值
  mutate(value = 1) %>%     # 标记存在的类别为1
  pivot_wider(names_from = group, values_from = value, values_fill = 0) %>%  # 转宽格式,缺失值填0
  arrange(ID)  # 按ID排序

print(df_result)

方法2:data.table(大数据集高效选择)

如果处理大规模数据,data.table的运算效率更优:

library(data.table)

setDT(df)
df_result <- df[, .(group = unique(group)), by = ID][, value := 1] %>%
  dcast(ID ~ group, value.var = "value", fill = 0)

print(df_result)

方法3:基础R实现(无额外依赖)

不加载第三方包的情况下,用基础函数组合完成:

# 提取每个ID对应的唯一group
id_unique_groups <- tapply(df$group, df$ID, unique)

# 生成每个ID的虚拟变量
dummy_data <- lapply(id_unique_groups, function(groups) {
  c(A = as.integer("A" %in% groups),
    B = as.integer("B" %in% groups),
    C = as.integer("C" %in% groups),
    D = as.integer("D" %in% groups))
})

# 转换为目标数据框
df_result <- data.frame(ID = as.integer(names(dummy_data)), do.call(rbind, dummy_data))

print(df_result)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 00:57:26