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

R语言将多列DX与PROC代码重塑为指定格式的技术问题

解决R语言中诊断码(DX)和操作码(PROC)的宽表转长表问题

你需要将宽格式的DX列(DX1-DX25)和PROC列(PROC1-PROC20)转换为包含标识与代码的长表结构,之前的melt参数使用错误,以下是两种正确实现方法:

方法一:使用data.table的patterns批量匹配列

这种方法适合一次性处理两类列,代码更简洁:

library(data.table)

# 构造正确的数据集(避免cbind导致数值型列被强制转为字符型)
MRN <- c(1,2,3,4)
DX1 <- c('12','14','16','m78.2')
DX2 <- c('m46.2', 'z98.0', 'z86.711', 'm10.6')
DX3 <- c('m10.7', 'Z86.711', 'M45.1', 'K21.9') 
PROC1 <- c(06030, 06020, 06047, 22585)
PROC2 <- c(63020, 63030, 63047, 63030)
PROC3 <- c(22551, 22558, 22528, 22558)
spine_pt_3 <- data.frame(MRN, DX1, DX2, DX3, PROC1, PROC2, PROC3)

# 转换为data.table对象
setDT(spine_pt_3)

# 一次性转置DX和PROC列
spine3 <- melt(spine_pt_3, 
               id.vars = "MRN",  # 保留的唯一标识列
               measure.vars = patterns("^DX", "^PROC"),  # 匹配以DX、PROC开头的列
               variable.name = c("DX_index", "PROC_index"),  # 标识列的名称
               value.name = c("DX_code", "PROC_code")  # 代码值列的名称
)

# 将数字索引转换为目标标识格式(如1→DX1)
spine3[, DX_index := paste0("DX", DX_index)]
spine3[, PROC_index := paste0("PROC", PROC_index)]

方法二:分别转置DX和PROC后合并

如果觉得批量匹配不够直观,可以分开处理两类列再合并,逻辑更清晰:

library(data.table)

# 构造数据集(同方法一)
MRN <- c(1,2,3,4)
DX1 <- c('12','14','16','m78.2')
DX2 <- c('m46.2', 'z98.0', 'z86.711', 'm10.6')
DX3 <- c('m10.7', 'Z86.711', 'M45.1', 'K21.9') 
PROC1 <- c(06030, 06020, 06047, 22585)
PROC2 <- c(63020, 63030, 63047, 63030)
PROC3 <- c(22551, 22558, 22528, 22558)
spine_pt_3 <- data.frame(MRN, DX1, DX2, DX3, PROC1, PROC2, PROC3)
setDT(spine_pt_3)

# 转置所有DX列
dx_long <- melt(spine_pt_3, 
                id.vars = "MRN",
                measure.vars = paste0("DX", 1:3),  # 指定所有DX列
                variable.name = "DX_identifier",
                value.name = "DX_code")

# 转置所有PROC列
proc_long <- melt(spine_pt_3, 
                  id.vars = "MRN",
                  measure.vars = paste0("PROC", 1:3),  # 指定所有PROC列
                  variable.name = "PROC_identifier",
                  value.name = "PROC_code")

# 合并两个长表(去掉重复的MRN列)
spine3 <- cbind(dx_long, proc_long[, -1])

针对实际数据集的调整

  • 若你的数据集有25个DX列,将代码中的paste0("DX",1:3)改为paste0("DX",1:25)
  • 若有20个PROC列,将paste0("PROC",1:3)改为paste0("PROC",1:20)

原代码错误原因

你之前使用的measure1、measure2、Variable1等参数并非data.table::melt的有效参数,多组列转置需要使用measure.vars = patterns()或传递列名列表来实现。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 10:30:53