SAS。在数据步骤的每次迭代中是否将变量设置为缺失?

SAS。在数据步骤的每次迭代中是否将变量设置为缺失?,sas,Sas,我一直认为,对于数据步骤的每次迭代,变量都被设置为缺失。但是,在下面的代码中,它看起来像是变量一开始获得的值。我不明白为什么会这样 data one; input x $ y; datalines; a 10 a 13 a 14 b 9 ; run; data two; input z; datalines; 45 ; run; data test; if _n_ = 1 then set two; /* when _n_=2 the PDV assigns missing values,

我一直认为,对于数据步骤的每次迭代,变量都被设置为缺失。但是,在下面的代码中,它看起来像是变量一开始获得的值。我不明白为什么会这样

data one;
input x $ y;
datalines;
a 10
a 13
a 14
b 9
;
run;

data two;
input z;
datalines;
45
;
run;

data test;
if _n_ = 1 then set two; /* when _n_=2 the PDV assigns missing values, right ? */
set one;
run;
proc print;
run; 
结果是

   z      x     y  
   45     a    10
   45     a    13
   45     a    14
   45     b     9
我本想得到这个

   z      x     y  
   45     a    10
   .      a    13
   .      a    14
   .      b     9

SAS不会为-SET、MERGE、MODIFY或UPDATE语句重置PDV中的值。因为您使用的是SET语句,所以SAS不会重置它

if _n_ = 1 then set two;

阅读-执行阶段- 指针5


SAS为PDV中的每个变量设置一个标志,该标志指定当数据步返回到循环的开始时会发生什么。此标志表示变量将重置为缺失,或不会重置为缺失(并将保留当前值)

默认情况下,此标志指示应重置变量。此标志通常通过以下两种方式之一设置为“保留值”

  • 首先,如果RETAIN语句中存在一个变量,或者在左侧使用了SUM运算符(
    x+1;
    ),则为该变量设置标志
  • 其次,如果变量出现在
    集合
    合并
    、“修改”或
    更新
    语句中,则为该变量设置标志
在这种情况下,变量
z
出现在
set
语句中,因此它会自动保留

这是另一个很好的例子

data test1;
do x=1 to 5;
  y=2;
  output;
end;
run;

data test2;
  do x=6 to 10;
    output;
  end;
run;

data test3;
  set test1 test2;
  if x=7 then y=4;
run;
这里,
y
将在读取
test1
的最后一条记录后设置为missing;这是因为在by group或dataset的末尾,它将所有变量设置为missing一次。但是,
y
仍然自动保留;那面旗帜是无法改变的。所以当我设置
y=4x=7
记录上的code>,4始终保留。因此
x=6
缺少
y
,但是
x=7
通过
x=10
拥有
y=4

但是等等,你说。我的变量
x
y
也出现在
set
语句中,它们不会自动保留。每次数据步骤从数据集中读取数据时,都会重新设置它们

没有。它们被设置为一个新的值,是的:但它们从未被设置为丢失。这在少数情况下具有特殊的相关性:多对一合并,基本上与上述情况类似,但与
by
组一起工作:
one
记录合并到所有
many
,不是因为它被多次读取,而是因为它被读取一次,然后没有重新设置为丢失(即保留)。这就是为什么如果您没有意识到这一点,多对一合并会有点危险:

data test1;
  do x=1 to 5;
    z=0;
    output;
  end;
run;

data test2;
  do x=1 to 5;
    do y=1 to 3;
      output;
    end;
  end;
run;

data testMerge;
  merge test1 test2;
  by x;
  if y=2 then z=1;
run;

请注意,
z=1
对于
y=2
y=3
记录都是正确的,尽管我没有要求这样做!哎呀!这是因为
z
是通过组记录从
test1
读取的,每个
x
的第一个
都读取了一次,然后没有重新读取-只是保留了下来。

好的,我得到了它。SAS不会将变量值重置为missing,除非它即将读取新记录。谢谢(删除与先前版本答案相关的评论。)