使用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的数值
原代码问题分析
你写的代码存在两个核心错误:
- 行数计算错误:示例DT2的行数是
max(DT1$bf_target_N) + max(DT1$bf_comparator_N),而非2*nrow(DT1) - 赋值逻辑错误:直接将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)
代码逻辑说明
- 行数确定:通过
max()函数获取两组的最大数值,以此确定每组需要生成的行数 - 0-1向量生成:利用行索引序列与药物对应数值做比较,将布尔结果转换为整数1/0,自动实现「前N个1、后续补0」的效果
- 数据合并:用
rbind()将两组数据拼接,得到最终符合要求的DT2
内容的提问来源于stack exchange,提问作者zell kim
相关产品推荐
相关产品推荐

