如何在SAS中用数组实现数据转置(禁止使用PROC TRANSPOSE)
使用SAS DO ARRAY实现宽表转长表(替代PROC TRANSPOSE)
需求说明
将如下宽格式数据集:
col col2 a b c d 001 A 1 3 5 7 002 B 2 4 6 8
转换为指定的长格式数据集,要求使用DO ARRAY实现,禁止使用PROC TRANSPOSE:
col col2 col_new 001 A 1 001 A 3 001 A 5 001 A 7 002 B 2 002 B 4 002 B 6 002 B 8
实现代码
假设原宽表名为wide,生成的长表名为long,代码如下:
data long; set wide; /* 定义数组,包含需要转置的变量a、b、c、d */ array trans_vars[*] a b c d; /* 遍历数组中所有元素 */ do idx = 1 to dim(trans_vars); col_new = trans_vars[idx]; /* 输出当前行,生成对应长表记录 */ output; end; /* 删除不需要的原变量和循环控制变量 */ drop a b c d idx; run;
代码解释
- 数组定义:
array trans_vars[*] a b c d;创建数组trans_vars,包含需要转置的4个变量,[*]让SAS自动识别数组元素数量,无需手动指定长度。 - 循环遍历:
do idx = 1 to dim(trans_vars);通过dim()函数获取数组长度(此处为4),循环4次处理每个变量。 - 赋值与输出:每次循环将数组当前元素的值赋值给
col_new,执行output;输出一行记录,实现宽表到长表的行拆分。 - 清理变量:
drop语句移除原数组变量和循环变量idx,仅保留目标字段col、col2、col_new。
效果验证
运行代码后,原数据中的每一行会生成4条长表记录,最终得到8行目标数据,完全符合需求。
内容的提问来源于stack exchange,提问作者Aiko VanDijk
相关产品推荐
相关产品推荐

