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

使用data.table将DT1转换为填充二进制值的DT2问题求助

问题解决:将DT1转换为二进制填充的DT2数据表

需求规则明确

DT2的生成逻辑是:

  • 按type分为bf_target_N和bf_comparator_N两组
  • 每组的总行数等于该组内所有药物对应数值的最大值(比如bf_target_N最大值为4,对应4行;bf_comparator_N最大值为5,对应5行)
  • 每个药物列在对应type的行中,前N个值为1,剩余为0,N是DT1中该药物对应type的数值

原代码问题分析

你写的代码存在两个核心错误:

  1. 行数计算错误:示例DT2的行数是max(DT1$bf_target_N) + max(DT1$bf_comparator_N),而非2*nrow(DT1)
  2. 赋值逻辑错误:直接将DT1的数值赋值给整列,没有生成「前N个1、后续补0」的向量

正确实现代码

library(data.table)

# 原始DT1数据
DT1 <- fread("variable    bf_target_N bf_comparator_N
drugA   2   1
drugB   3   4
drugC   4   5
")

# 计算两组各自需要的总行数
target_total_rows <- max(DT1$bf_target_N)
comparator_total_rows <- max(DT1$bf_comparator_N)

# 生成两组的行索引序列
target_index <- seq_len(target_total_rows)
comparator_index <- seq_len(comparator_total_rows)

# 构建DT2
DT2 <- rbind(
  # 处理bf_target_N组
  data.table(
    type = "bf_target_N",
    drugA = as.integer(target_index <= DT1[variable == "drugA", bf_target_N]),
    drugB = as.integer(target_index <= DT1[variable == "drugB", bf_target_N]),
    drugC = as.integer(target_index <= DT1[variable == "drugC", bf_target_N])
  ),
  # 处理bf_comparator_N组
  data.table(
    type = "bf_comparator_N",
    drugA = as.integer(comparator_index <= DT1[variable == "drugA", bf_comparator_N]),
    drugB = as.integer(comparator_index <= DT1[variable == "drugB", bf_comparator_N]),
    drugC = as.integer(comparator_index <= DT1[variable == "drugC", bf_comparator_N])
  )
)

# 输出结果
print(DT2)

代码逻辑说明

  1. 行数确定:通过max()函数获取两组的最大数值,以此确定每组需要生成的行数
  2. 0-1向量生成:利用行索引序列与药物对应数值做比较,将布尔结果转换为整数1/0,自动实现「前N个1、后续补0」的效果
  3. 数据合并:用rbind()将两组数据拼接,得到最终符合要求的DT2

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 17:22:54