【问题标题】:concatenating two datasets and getting unexpected results in SAS连接两个数据集并在 SAS 中获得意外结果
【发布时间】:2017-12-01 03:46:20
【问题描述】:

我遇到了一个相当奇怪的情况,我将两个数据集连接起来,得到了非常出乎意料的结果。这是设置:

data a;
    do i=1 to 100;
        output;
    end;
run;


data b;
    do j=5 to 79;
        output;
    end;
run;

data c;
    set a b;
    if j=. then j=i;
run;

有人可以向我解释为什么 j 在前 100 个观察值中取值为“1”吗?看起来 j 被保留了,但更奇怪的是,如果我将条件更改为:

data c;
    set a b;
    if i=. then i=j;
run;

那么“retain”语句”意味着在第 100 次观察之后,您应该看到 100 被保留下来,但事实并非如此!它是 5!这是怎么回事?

谢谢,

【问题讨论】:

    标签: io sas set concatenation


    【解决方案1】:

    来自输入数据集的所有变量都被“保留”。您通常不会注意到它,因为执行 SET 语句时会覆盖这些值。在您的示例数据集中 B 对前几个观察没有贡献,因此您在数据步骤的第一次迭代中放入变量 J 的值不会被覆盖,直到您开始从数据集 B 读取。

    另一个问题是,当您从读取数据集A 转换到读取日期集B 时,来自A 的变量将被清除。

    将一些 PUT 语句添加到您的数据步骤中,以便您可以看到正在发生的事情,这样会更清楚。

    data both;
      put / 'TOP   :' (_n_ i j) (=);
      set a(obs=3) b(obs=3) ;
      put 'MIDDLE:' (_n_ i j) (=);
      if missing(j) then j=i ;
      put 'BOTTOM:' (_n_ i j) (=);
    run;
    

    结果

    TOP   :_N_=1 i=. j=.
    MIDDLE:_N_=1 i=1 j=.
    BOTTOM:_N_=1 i=1 j=1
    
    TOP   :_N_=2 i=1 j=1
    MIDDLE:_N_=2 i=2 j=1
    BOTTOM:_N_=2 i=2 j=1
    
    TOP   :_N_=3 i=2 j=1
    MIDDLE:_N_=3 i=3 j=1
    BOTTOM:_N_=3 i=3 j=1
    
    TOP   :_N_=4 i=3 j=1
    MIDDLE:_N_=4 i=. j=5
    BOTTOM:_N_=4 i=. j=5
    
    TOP   :_N_=5 i=. j=5
    MIDDLE:_N_=5 i=. j=6
    BOTTOM:_N_=5 i=. j=6
    
    TOP   :_N_=6 i=. j=6
    MIDDLE:_N_=6 i=. j=7
    BOTTOM:_N_=6 i=. j=7
    
    TOP   :_N_=7 i=. j=7
    

    【讨论】:

    • 我明白这样做是为了合并语句,但设置语句的目的是什么?
    • 我怀疑这就是它的工作方式。一旦你拥有了一个以特定方式工作的系统,你就无法在不破坏现有程序的情况下对其进行更改。
    猜你喜欢
    • 1970-01-01
    • 2015-12-04
    • 1970-01-01
    • 1970-01-01
    • 2019-08-15
    • 2021-08-30
    • 1970-01-01
    • 1970-01-01
    • 2011-09-30
    相关资源
    最近更新 更多