如何在SAS EG中转置含多数据类型列的ICD诊断数据集?
SAS数据集宽表转长表(配对ICD代码与描述)解决方案
一、是否误用Proc Transpose?
是的,直接使用Proc Transpose无法满足需求。Proc Transpose是单维度列转行工具,无法同时保留ICD代码与对应描述的配对关系,强行转置会把两类数据混在同一列,导致结构混乱。你需要用Unpivot(列转置配对)或数组循环的方式实现目标结构。
二、SAS EG可视化操作步骤(无需代码)
使用EG内置的Unpivot任务可以轻松完成配对转置:
- 打开目标数据集,在顶部菜单选择数据 > Unpivot(或在任务面板的「数据转换」分类中找到Unpivot)。
- 在Unpivot设置界面:
- 保留列:选中
SSN(唯一标识符列),确保每个分组的标识保留。 - 配对列组:创建6组配对,每组包含对应的ICD代码列和描述列(比如第一组选
ICD1和Desc1,第二组选ICD2和Desc2,依次到第6组)。 - 新列命名:将所有配对后的代码列统一命名为
ICD_Code,描述列统一命名为ICD_Desc。
- 保留列:选中
- 点击运行,生成的数据集即为每行对应一个SSN+一个ICD代码+对应描述的结构。
三、SAS代码实现方案
如果习惯用代码处理,以下两种方案更灵活:
方案1:数组循环(适合固定数量的配对列)
假设你的ICD代码列名为ICD1-ICD6,描述列名为Desc1-Desc6,代码如下:
data target_data; set original_data; /* 定义数组存储所有ICD代码和描述列 */ array icd_codes[6] ICD1-ICD6; array icd_descs[6] Desc1-Desc6; /* 循环遍历每组配对,输出单行记录 */ do i = 1 to 6; /* 跳过空诊断记录(可选,根据需求调整) */ if not missing(icd_codes[i]) then do; ICD_Code = icd_codes[i]; ICD_Desc = icd_descs[i]; output; end; end; /* 保留需要的列,删除临时变量和原多列 */ keep SSN ICD_Code ICD_Desc; drop i ICD1-ICD6 Desc1-Desc6; run;
方案2:Proc Unpivot代码(与EG任务逻辑一致)
直接用Proc Unpivot指定配对列:
proc unpivot data=original_data out=target_data; by SSN; /* 明确指定每组代码与描述的配对关系 */ pair ICD1 with Desc1 as (ICD_Code ICD_Desc), ICD2 with Desc2 as (ICD_Code ICD_Desc), ICD3 with Desc3 as (ICD_Code ICD_Desc), ICD4 with Desc4 as (ICD_Code ICD_Desc), ICD5 with Desc5 as (ICD_Code ICD_Desc), ICD6 with Desc6 as (ICD_Code ICD_Desc); run;
内容的提问来源于stack exchange,提问作者AJ1981
相关产品推荐
相关产品推荐

