【发布时间】:2019-09-09 13:39:20
【问题描述】:
我有很多数据集需要具有相同的结构 - 相同的变量、相同的顺序。我有一个用作模板的数据集(下面代码中的“全部”)。通过在同一个 set 语句中列出模板数据集(obs=0)和特定数据集(下面代码中的“some”)来给出其他数据。这工作得很好。
然后我想遍历变量。如果其中一个缺失(如果它不存在于特定数据集中),则应将其设置为前一个变量的值。 var2 应该从 var1 等获取值。 这应该在每一行内完成。如果在单独的数据步骤中完成,这可以正常工作,但如果在上述相同的数据步骤中完成,则不起作用。
如果在同一数据步骤中完成,为缺失值插入的值将始终来自第 1 行。这是为什么呢?我可以在不使用其他数据步骤的情况下获得想要的结果吗?
/* All the variables a complete data set should contain.*/
data all;
format var1-var5 $20.;
run;
/* Actual data have some of these variables, but not all. var1 is never missing, all other variables might be*/
data some;
var1="Obs 1, Value 1";
var4="Obs 1, Value 4";
output;
var1="Obs 2, Value 1";
var4="Obs 2, Value 4";
output;
run;
/* Not working - The values inserted when the conditional is true are all from row 1*/
data dont_want;
set all(obs=0) some;
array chars{*} _character_;
do i=1 to dim(chars);
if missing(chars{i}) then chars{i}=chars{i-1};
end;
drop i;
run;
/* Working*/
data temp;
set all(obs=0) some;
run;
data want;
set temp;
array chars{*} _character_;
do i=1 to dim(chars);
if missing(chars{i}) then chars{i}=chars{i-1};
end;
drop i;
run;
【问题讨论】:
-
DO 循环的下限必须为 2,否则
chars{i-1}将是无效的数组引用。 -
是的。但这不会改变所描述的行为。 var1 永远不会丢失,因此 SAS 永远不会尝试检索 chars[0}。
-
@RuneS 仅存在于 ALL (var2 var3 var5) 中的变量不会被重置为丢失。使用 OUTPUT 语句,然后调用 missing(of chars[*])
标签: sas