SAS DO循环使用SET语句

时间:2018-04-12 07:53:16

标签: sas

给出两个简单的数据集A和B如下

DATA A; INPUT X @@;
CARDS;
1 2 3 4
RUN;

DATA B; INPUT Y @@;
CARDS;
1 2
RUN;

我正在尝试创建两个名为C和D的数据集,一个使用重复的SET和OUTPUT语句,另一个使用DO循环。

DATA C;      
  SET B; 
  K=1; DO; SET A; OUTPUT; END;
  K=K+1; DO; SET A; OUTPUT; END;
  K=K+1; 
RUN;

DATA D;
  SET B; 
  DO K = 1 TO 2; 
    SET A; OUTPUT; 
  END; 
RUN;

我认为C和D应该与DO循环相同,应该重复那些语句,如C的DATA步骤所示,但事实证明它们是不同的。

Dataset C:
Obs    Y    K    X
 1     1    1    1
 2     1    2    1
 3     2    1    2
 4     2    2    2

Dataset D:
Obs    Y    K    X
 1     1    1    1
 2     1    2    2
 3     2    1    3
 4     2    2    4

有人可以解释一下吗?

2 个答案:

答案 0 :(得分:3)

第一个数据步骤中的两个SET A语句是独立的。因此,在数据步骤的每次迭代中,它们都将读取相同的观察结果。所以就好像你改变了这一步。

data c;
  set b;
  set a;
  do k=1 to 2; output; end;
run;

第二个数据步骤中的SET A语句将在数据步骤的第一次迭代中执行两次。因此,对于数据步骤的每次迭代,它将从A读取两个观察值。

如果您真的想要进行交叉连接,则需要使用point=选项,以便重新读取其中一个数据集。

data want ;
  set b ;
  do p=1 to nobs ;
    set a point=p nobs=nobs ;
    output;
  end;
run;

答案 1 :(得分:2)

你的表B有两个obs,所以你的代码只会进行两次迭代:

  1. 每次阅读新观察时K都会重置为1,解决方案:使用Retain关键字。
  2. 当您的当前记录是OBS 1并且您输出时,您将继续输出每个表的第一行,这就是您从表A输出第一行和第二行的原因。
  3. 调试:

    迭代1当前视图:

    Obs Table X
    1    A    1
    Obs Table Y k 
    1    B    1 1
    

    输出:

    K=1; DO; SET A; OUTPUT; END;
    Obs    Y    K    X
     1     1    1    1
    
    K=K+1; DO; SET A; OUTPUT; END;
    Obs    Y    K    X
    2     1    2    1
    

    迭代2当前视图:

    Obs Table X
    2    A    2
    Obs Table Y k 
    2    B    2 1 
    

    输出:

    K=1; DO; SET A; OUTPUT; END;
    Obs    Y    K    X
     3     2    1    2
    
    K=K+1; DO; SET A; OUTPUT; END;
    Obs    Y    K    X
    4     2    2    2