如何将data.table按列值转置为含0/1标记的宽表?
解决方案:将data.table转换为0-1标记的宽表
下面提供三种可行的方案,适配你的需求:
方法1:data.table原生dcast函数(推荐)
这是最贴合data.table语法的实现方式,借助dcast完成宽表转换,配合填充参数直接生成0-1标记:
library(data.table) # 原数据 a <- data.table(A = seq(1:5), B = c("V1","V2","V1","V2","V3")) # 添加临时值为1的列,用于后续填充 a[, val := 1] # 执行宽表转换:A+B作为行唯一标识,B列值作为新列名,缺失位置填充0 result <- dcast(a, A + B ~ B, value.var = "val", fill = 0) print(result)
运行后会直接得到目标结果,临时列val会被自动处理,最终保留A、B列及所有V开头的0-1标记列。
方法2:修正tidyverse的pivot_wider参数
你之前尝试pivot_wider未成功,大概率是未正确设置行标识和缺失值填充参数,调整后即可正常运行:
library(tidyverse) library(data.table) a <- data.table(A = seq(1:5), B = c("V1","V2","V1","V2","V3")) result <- a %>% mutate(val = 1) %>% # 添加临时1值列 pivot_wider( id_cols = c(A, B), # 指定A和B作为行的唯一标识 names_from = B, # 从B列提取新列名 values_from = val, # 用val列的值填充新列 values_fill = 0 # 无匹配的位置填充0 ) print(result)
方法3:用model.matrix快速生成哑变量
如果想更简洁,直接借助model.matrix生成0-1哑变量矩阵,再与原表合并:
library(data.table) a <- data.table(A = seq(1:5), B = c("V1","V2","V1","V2","V3")) # 生成B列的哑变量矩阵(去掉截距项避免冗余) dummy_cols <- model.matrix(~ B - 1, data = a) # 合并原表与哑变量矩阵 result <- cbind(a, dummy_cols) print(result)
这个方法无需手动添加临时列,model.matrix会自动将B的每个取值转换为对应的0-1列,效率很高。
内容的提问来源于stack exchange,提问作者Kasitru
相关产品推荐
相关产品推荐

