R语言多列数据框转ID+数据点两列格式求助
搞定宽表转长表 + Comorbidity包分析的实操指南
Hey there! 作为R新手要处理百万级的宽表确实有点头大,别担心,我来给你一步步捋清楚怎么搞定转长表+用Comorbidity包分析的事儿~
第一步:把宽格式数据转成需要的长格式
因为你要处理数百万条记录,我给你推荐两种方法:一种是速度拉满适合大数据的data.table,另一种是语法直观新手友好的tidyr工具,你按需选就行:
方法1:用data.table(大数据首选,快到飞起)
先装包加载:
install.packages("data.table") library(data.table)
把你的数据转成data.table格式,再用melt函数一键转长:
# 假设你的原数据框名叫df setDT(df) # 把普通数据框转成data.table long_df <- melt(df, id.vars = "ID", # 保留ID列作为标识 measure.vars = patterns("^Dx"), # 匹配所有Dx开头的列(Dx1到Dx33) variable.name = "Dx_col", # 暂时存原列名(比如Dx1) value.name = "Dx") # 把诊断编码命名为Dx # 要是不需要原列名(Dx1/Dx2这些),直接删掉就行 long_df[, Dx_col := NULL]
转完之后的结果就完全是你想要的结构啦:
ID Dx
1 12
1 11
1 0
2 3
2 1
...
方法2:用tidyr的pivot_longer(新手友好,语法好懂)
如果你更习惯tidyverse的风格,用这个:
install.packages("tidyr") library(tidyr) long_df <- df %>% pivot_longer(cols = starts_with("Dx"), # 选所有Dx开头的列 names_to = "Dx_col", # 存原列名 values_to = "Dx") %>% # 诊断编码列名设为Dx select(-Dx_col) # 删掉不需要的原列名字段
第二步:用Comorbidity包做合并症分析
转好长表就可以用Comorbidity包啦,先装包加载:
install.packages("comorbidity") library(comorbidity)
核心就是comorbidity()函数,参数设置很关键,我给你写好注释:
# 生成每个ID的合并症分组结果 comorb_df <- comorbidity(x = long_df, id = "ID", # 指定ID列 code = "Dx", # 指定诊断编码列 map = "icd10", # 因为你的编码是ICD-10,必须对应上 assign0 = FALSE) # 划重点:如果你的Dx=0是「无诊断」,就改成TRUE,会自动排除;如果0是有效编码,就保持FALSE
运行完之后,comorb_df里会有每个ID对应的各种合并症分组(比如Charlson合并症里的糖尿病、心脏病这些),要是想算合并症得分也很简单:
# 计算Charlson合并症指数得分 comorb_df$charlson_score <- charlson(comorb_df)
给新手的小提醒
- 处理百万级数据优先选
data.table,比tidyverse省内存还快很多 - 要是原数据里有NA值,转长表的时候可以加个
na.rm = TRUE参数删掉(比如melt(..., na.rm = TRUE)) - 用Comorbidity包前,先确认你的Dx编码是标准ICD-10格式,不然会导致分组出错哦
内容的提问来源于stack exchange,提问作者RROBINSON
相关产品推荐
相关产品推荐

