如何用SAS Proc Transpose实现多变量宽表转长表并匹配ID与去重
SAS宽表转长表并去重解决方案
1. 先去除原始数据的重复行
原始数据集存在重复观测,先通过排序去重,保留每个ID唯一的宽表记录:
proc sort data=test nodupkey; by ID Status_01 date_01 Status_02 date_02 Status_03 date_03; run;
2. 宽表转长表(两种实现方式)
方式一:数据步循环实现
通过循环遍历每组status_xx和date_xx变量,输出对应观测:
data test_target; set test; length status $175; format date mmddyy10.; /* 遍历3组状态-日期对 */ do idx = 1 to 3; status = vvaluex(cats('Status_', put(idx, z2.))); date = input(vvaluex(cats('date_', put(idx, z2.))), mmddyy10.); output; end; drop idx Status_01-date_03; run;
注:
vvaluex函数用于通过变量名的字符串形式获取变量值,比resolve更稳定。
方式二:PROC TRANSPOSE合并实现
分别转置状态和日期变量,再按ID合并:
/* 转置状态文本 */ proc transpose data=test out=status_t(rename=(col1=status) drop=_name_); by ID; var Status_01 Status_02 Status_03; run; /* 转置日期 */ proc transpose data=test out=date_t(rename=(col1=date) drop=_name_); by ID; var date_01 date_02 date_03; format date mmddyy10.; run; /* 合并得到目标数据集 */ data test_target; merge status_t date_t; by ID; run;
最终效果
生成的test_target数据集与你提供的test_01结构完全一致,每个ID对应3条唯一的状态-日期观测。
内容的提问来源于stack exchange,提问作者Ryan
相关产品推荐
相关产品推荐

