如何创建含重复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
相关产品推荐
相关产品推荐

