SAS DO循环与SET语句

SAS DO循环与SET语句,sas,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;

给出两个简单的数据集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循环相同,DO循环应该重复这些语句,如C的数据步骤所示,但事实证明它们是不同的

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

有人能解释一下吗?

您的表B有两个OB,因此您的代码将只执行两次迭代:

  • 每次读取新的观察值时,K重置为1,解决方案:使用
    Retain
    关键字
  • 当当前记录为OBS 1并进行输出时,将继续输出每个表的第一行,这就是为什么从表A输出第一行和第二行两次
  • 调试:

    迭代1当前视图:

    Obs Table X
    1    A    1
    Obs Table Y k 
    1    B    1 1
    
    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
     1     1    1    1
    
    K=K+1; DO; SET A; OUTPUT; END;
    Obs    Y    K    X
    2     1    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
    
    迭代2当前视图:

    Obs Table X
    1    A    1
    Obs Table Y k 
    1    B    1 1
    
    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
     1     1    1    1
    
    K=K+1; DO; SET A; OUTPUT; END;
    Obs    Y    K    X
    2     1    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
    

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

    data c;
      set b;
      set a;
      do k=1 to 2; output; end;
    run;
    
    第二个数据步骤中的
    SET
    语句将在数据步骤的第一次迭代中执行两次。因此,对于数据步骤的每次迭代,它将从
    A
    读取两个观察值

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

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

    谢谢您的回答,是否可以修改“数据C;”使其产生与“数据D;”相同的结果?所述差异表明我对DO循环如何运行的理解可能不正确。不能让执行两个不同的SET语句的操作与执行一个SET语句两次的操作相同。您可以为两个不同的SET语句使用两个不同的POINT=指针变量。请注意,第一个数据步骤中的DO/END块没有做任何事情。您可以删除DO和END语句,如果没有它们,该步骤将完全相同。