【问题标题】:SAS DO loop with SET statement带有 SET 语句的 SAS DO 循环
【发布时间】:2018-04-12 07:53:16
【问题描述】:

给定两个简单的数据集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

有人可以解释一下吗?

【问题讨论】:

  • 请注意,第一个数据步骤中的 DO/END 块没有做任何事情。您可以删除 DO 和 END 语句,没有它们,该步骤将完全相同。

标签: sas


【解决方案1】:

第一个数据步骤中的两个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;

【讨论】:

  • 谢谢您的回答,是否可以修改'DATA C; ' 这样它会产生与 'DATA D; 相同的结果; '?所述差异表明我对 DO 循环如何运行的理解可能不正确。
  • 您不能使执行两个不同的 SET 语句的操作与执行一个 SET 语句两次的操作相同。您可以为两个不同的 SET 语句使用两个不同的 POINT= 指针变量。
【解决方案2】:

您的表 B 有两个 obs,因此您的代码只会进行两次迭代:

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

调试:

迭代 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-07
    • 1970-01-01
    相关资源
    最近更新 更多