loops - 迭代 SAS 中的自定义集
问题描述
首先,为我糟糕的英语道歉,但那是因为我不是本地人。我也是 SAS 编程的新手,我需要有人帮助我解决这个困扰我的问题。我有一个数据集 A,其中包含一个代表年份和月份的数字字段 YM(例如 200902),我用它来过滤数据集。特别是,我想使用 N 个不同的值 YM 获得 N 个过滤数据集。
- A_filtered_200901 = A.filter(YM == 200901)
- A_filtered_200902 = A.filter(YM == 200902)
- A_filtered_200903 = A.filter(YM == 200903)
- ...
我的想法是生成用于过滤的 YM 序列,然后将其作为参数提供给包含 PROC SQL 的 %macro。在代码/伪代码中:
data ym_dataset;
date = input(put(20090201, 8.), yymmdd8.);
do i = 1 to 3;
aux1 = intnx('MONTH', date, i);
aux2 = put(aux1, yymmddn8.);
list_of_ym_values = substr(aux2 , 1, 6);
output;
end;
run;
%macro my_macro(list_of_ym_values);
proc sql;
%do i = 1 %to dim(&list_of_ym_values)
select *
from A
where YM = &list_of_ym_values(i)
%end
quit;
%mend my_macro;
%my_macro(ym_dataset[list_of_ym_values])
我知道这不是正确的方法,但我希望有人能给我一些关于正确执行它的信息。
谢谢!!
解决方案
您需要遍历变量列表,并且可以在宏变量中创建此值。但正如@richard 在评论中建议的那样,拆分数据集并不是一个好主意。
/* create macrovariable with all values*/
proc sql;
select list_of_ym_values into :List
separated by "|" from ym_dataset;
%put &list;
/* scan through each variable and create new dataset*/
%macro one;
%do i=1 %to %sysfunc(countw(&list),"|") ;
%let val= %scan(&list,&i,|);
proc sql;
create table want_&val as
select * from ym_dataset
where list_of_ym_values = "&val";
%end;
%mend;
%one;
推荐阅读
- c# - 堆叠 WPF 窗口
- c# - C# Mongo 序列化问题
- react-native - 如何在 React Native 中设置根视图的背景?
- php - 与整数中的 PHP 相比,如何在 Python 中使用逻辑运算符?
- java - Java 1.7。函数的实现
- php - codeigniter 4 - 找不到控制器或其方法
- jmeter - 使用 JMeter JSON Extractor 访问 JSON 数组值
- flutter - 我需要帮助在颤振中做 API
- google-cloud-platform - 重复的日志条目谷歌云在使用 python 的谷歌云功能中的堆栈驱动程序上登录
- excel - VBA Excel - 保存文件时无效的过程调用或参数