【问题标题】:Iterate over a custom set in SAS迭代 SAS 中的自定义集
【发布时间】:2018-10-19 10:20:12
【问题描述】:

首先,为我糟糕的英语道歉,但那是因为我不是本地人。我也是 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])

我知道这不是正确的方法,但我希望有人能给我一些关于正确执行此操作的信息。

谢谢!!

【问题讨论】:

  • 拆分数据有什么特殊原因吗?作为 SAS 新手,您是否知道使用 where 语句和 by 语句可以在逻辑上发生很多“分裂”?当数据正确排序时,by 语句将自动处理中的观察结果。
  • 是的,我明白你的意思。我可以使用 SELECT + AGG FUNCTION + GROUP BY 来获取所有组,但实际上我为了寻求一般性而简化了我的问题的陈述。我真正的问题如下:构建一个时间序列,计算迭代 N 个日期的每个数据集的元素,但使用两个过滤器 A.filter(INI_YM 200901 ) 而不是我提出的那个。所以我的方法是构造N个数据集,格式为[YM, Count],然后全部追加得到时间序列数据集。
  • 顺便说一句,该评论是 Richard :D 的答案。 Reeza,感谢您提供的文档,非常有帮助!

标签: loops macros sas


【解决方案1】:

您需要循环遍历变量列表,并且可以在宏变量中创建此值。但正如 @richard 在 cmets 中建议的那样,拆分数据集并不是一个好主意。

 /* 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;

【讨论】:

  • 非常感谢基兰!在根据我的特殊情况调整您的代码后,它运行良好:D
猜你喜欢
  • 2015-08-11
  • 2018-09-06
  • 1970-01-01
  • 2015-10-31
  • 2016-11-19
  • 2015-02-04
  • 2010-10-24
  • 2013-02-17
相关资源
最近更新 更多