如何使用PROC TRANSPOSE重塑指定结构的SAS数据集?
解决方案
你需要分两次使用PROC TRANSPOSE,同时配合生成组合列名来实现目标结构,具体步骤如下:
1. 先将原数据集转置为长格式
这一步把var_1、var_2、var_3拆分成单独的行,同时保留cat1和time分组:
/* 假设原数据集名为original */ proc transpose data=original out=long_data; by cat1 time; var var_1 var_2 var_3; run;
转置后long_data的核心结构为:
| cat1 | time | NAME | COL1 |
|---|---|---|---|
| 0 | pre | var_1 | 8 |
| 0 | pre | var_2 | 12 |
| 0 | post | var_1 | 3 |
| ... | ... | ... | ... |
2. 生成组合列名
把cat1和time拼接成目标中的列名(如0pre、1post):
data long_data_with_col; set long_data; col_name = cats(cat1, time); /* 自动将数值型cat1转为字符后拼接 */ run;
3. 再次转置为宽格式
以_NAME_(即原变量名)为分组依据,将col_name作为新列名,COL1作为对应值:
proc transpose data=long_data_with_col out=final_result prefix=; by _NAME_; id col_name; var COL1; run; /* 可选:将_NAME_重命名为更清晰的列名 */ data final_result; set final_result; rename _NAME_ = variable; run;
最终final_result的结构就和你期望的完全一致:
| variable | 0pre | 1pre | 0post | 1post |
|---|---|---|---|---|
| var_1 | 8 | 6 | 3 | 9 |
| var_2 | 12 | 11 | 2 | 4 |
| var_3 | 7 | 1 | 9 | 8 |
内容的提问来源于stack exchange,提问作者alex
相关产品推荐
相关产品推荐

