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=4在x=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,除非它即将读取新记录。谢谢(删除与先前版本答案相关的评论。)