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
相关产品推荐
相关产品推荐

