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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 17:35:19