如何在SAS中动态生成PROC SURVEYSELECT步骤?
需求说明
需要批量生成重复的SAS代码,目标代码示例如下:
PROC SURVEYSELECT DATA=IBIS3_4 (where = (Exkl_UtgUtl_Flyg=3)) METHOD=SRS SAMPSIZE=&Exkl_UtgUtl_Flyg_kvot SEED=1234567 OUT=Exkl_UtgUtl_Flyg; RUN; PROC SURVEYSELECT DATA=IBIS3_4 (where = (Exkl_UtgUtl_Tag=3)) METHOD=SRS SAMPSIZE=&Exkl_UtgUtl_Tag_kvot SEED=1234567 OUT=Exkl_UtgUtl_Tag; RUN;
此前通过R生成代码,但复制到MS Word时需要手动清理引号、行号和换行符,希望直接在SAS中完成代码生成,跳过后续格式整理步骤。
SAS实现方案
完全可以通过SAS的数据步结合DO循环和PUT语句实现,直接生成无多余格式的目标代码,以下是两种可行方法:
方法一:直接用数组定义变量列表
适合变量列表无需复用的场景,在数据步内直接定义数组循环:
data _null_; /* 定义包含所有目标变量名的数组 */ array vars[22] $30 "Exkl_UtgUtl_Flyg" "Exkl_UtgUtl_Tag" "Exkl_UtgUtl_Farja" "Exkl_UtgUtl_Taxi" "Exkl_UtgUtl_Hyrbil" "Exkl_UtgUtl_Driv" "Exkl_UtgUtl_Bo" "Exkl_UtgUtl_Resta" "Exkl_UtgUtl_Shop" "Exkl_UtgUtl_Aktiv" "Exkl_UtgUtl_Annat" "Exkl_UtgSwe_Flyg" "Exkl_UtgSwe_Tag" "Exkl_UtgSwe_Farja" "Exkl_UtgSwe_Taxi" "Exkl_UtgSwe_Hyrbil" "Exkl_UtgSwe_Driv" "Exkl_UtgSwe_Bo" "Exkl_UtgSwe_Resta" "Exkl_UtgSwe_Shop" "Exkl_UtgSwe_Aktiv" "Exkl_UtgSwe_Annat"; /* 遍历数组生成代码 */ do i = 1 to dim(vars); var = vars[i]; put @1 "PROC SURVEYSELECT DATA=IBIS3_4 (where = (" var "=3)) METHOD=SRS"; put @1 "SAMPSIZE=&" var "_kvot SEED=1234567"; put @1 "OUT=" var ";"; put @1 "RUN;"; put; /* 输出空行分隔每个PROC块 */ end; /* 将代码写入外部文件,可直接复制到Word */ file "C:\your_path\generated_code.sas"; run;
方法二:先创建变量列表数据集
适合变量列表需要重复使用的场景,先把变量名存入数据集再循环读取:
/* 第一步:创建存储变量名的数据集 */ data var_list; input var_name $30.; datalines; Exkl_UtgUtl_Flyg Exkl_UtgUtl_Tag Exkl_UtgUtl_Farja Exkl_UtgUtl_Taxi Exkl_UtgUtl_Hyrbil Exkl_UtgUtl_Driv Exkl_UtgUtl_Bo Exkl_UtgUtl_Resta Exkl_UtgUtl_Shop Exkl_UtgUtl_Aktiv Exkl_UtgUtl_Annat Exkl_UtgSwe_Flyg Exkl_UtgSwe_Tag Exkl_UtgSwe_Farja Exkl_UtgSwe_Taxi Exkl_UtgSwe_Hyrbil Exkl_UtgSwe_Driv Exkl_UtgSwe_Bo Exkl_UtgSwe_Resta Exkl_UtgSwe_Shop Exkl_UtgSwe_Aktiv Exkl_UtgSwe_Annat ; run; /* 第二步:读取数据集生成代码 */ data _null_; set var_list; file "C:\your_path\generated_code.sas"; put @1 "PROC SURVEYSELECT DATA=IBIS3_4 (where = (" var_name "=3)) METHOD=SRS"; put @1 "SAMPSIZE=&" var_name "_kvot SEED=1234567"; put @1 "OUT=" var_name ";"; put @1 "RUN;"; put; run;
输出说明
- 执行上述代码后,指定路径下的.sas文件会生成干净的目标代码,打开后可直接复制到MS Word,无需清理任何格式。
- 如果仅需要在SAS日志中查看,删除
file语句即可,日志输出同样无多余符号和格式。
内容的提问来源于stack exchange,提问作者Magnus
相关产品推荐
相关产品推荐

