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

如何将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 12:10:50