楼主: 小鳄鱼a
830 11

请看看这个问题 [推广有奖]

11
小鳄鱼a 发表于 2015-12-15 16:04:00
请问这一步怎样体现的循环呢   

data _null_;
  set all_combinations;  * 上一次生成的;

  call execute("data comb" || strip(_N_) || ";" ||
               "  set test;                   " ||
               "  keep " || zuhe || ";"         ||
               "run;"
              );
run;

12
sniperhgy 发表于 2015-12-15 17:53:45
小鳄鱼a 发表于 2015-12-15 16:04
请问这一步怎样体现的循环呢   

data _null_;
set这个语句有一个“隐式循环”的特性,一旦用上set,从firstobs开始读取,直到obs结束,如果不指定,那么firstobs=1,obs=最大行数。楼主如果试过代码的话,会发现生成了42个数据集,从comb1到comb42,那么语句中,就是利用_N_来实现的:
1) data _null_ : 这一句,告诉sas不生成数据集,只在内存中执行一些操作
2) set all_combinations : 开始读取all_combinations,没有指定firstobs和obs,那么就是从第一条读到最后一条,这个过程就是“隐式循环”
3) call execute(...) : 向input stack中提交一些语句,因为all_combinations有42行,所以提交了42个数据部。
    a) "data comb" || strip(_N_) || ";"就得到了comb1 ~ comb42; "
    b)  set test;                   " 的话,因为要从test来生成数据集,所以要读取它 ;
    c)  "  keep " || zuhe || ";"  其中keep是字符串,zuhe是个变量,内容来自all_combinations,向input stack提交之前,内容会被解析出来和“keep ”拼接起来,也就达到了keep变量的作用。

如果还有不理解的,欢迎继续讨论。^_^

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-29 11:12