我有一个包含 300 多个变量的数据集,其中许多数值变量都有很多空值。我想为每个变量创建一个额外的二进制变量,该变量将说明该变量是否为空。
数据示例
- 身份证No_of_Visit No_of_PurchaseFlag_Null_No_Of_Visit Flag_Null_No_Of_Purchase
- 1 5 5 0 0
- 2 12 1 0 0
- 3 10 . 0 1
- 4 . . 1 1
有没有为多个列创建这些空/无空标志变量的快速方法?
与其创建一个新变量来标识它是否为 null,不如在处理此数据时使用内置数组逻辑。数组逻辑在功能上将执行相同的操作来标识变量是否为 null。唯一的区别是您要查找缺失值而不是 1,并且不需要引用新变量。您还可以减小数据大小并减少冗余变量。
data isnull;
set have;
array numvars[*] _NUMERIC_;
array charvars[*] _CHARACTER_;
do i = 1 to dim(numvars);
if(missing(numvars[i]) ) then <logic>;
end;
do i = 1 to dim(charvars);
if(missing(charvars[i]) ) then <logic>;
end;
run;
因此,您希望生成代码来创建新变量。以下是您可以使用的 SAS 代码。 如果您确实需要一个宏,请弄清楚宏输入是什么,然后转换为宏。
首先获取要转换的变量列表。 也许你只想要_NUMERIC_变量? 您可以使用 PROC CONTENT 或 DICTIONARY。列来执行此操作。或者只是使用PROC TRANSPOSE:
proc transpose data=have(obs=0) out=names ;
var _numeric_;
run;
现在使用该名称列表生成代码以创建新变量。 您需要为每个变量提供新名称。 如果您的原始变量足够短,您可以添加前缀或后缀。
filename code temp;
data names ;
set names ;
length null_name $32 ;
null_name = cats('NULL_',_name_);
file code ;
put null_name '=missing(' _name_ ');' ;
run;
现在,您可以在数据步骤中使用该代码来添加变量。
data want;
set have;
%incldue code / source2;
run;
对数值变量的数组使用nmiss
,如果它们是字符变量,则cmiss
。下面flag
后面的冒号将所有以字符串"flag"开头的变量放入数组flag_array
中。在输出中,如果缺少任何标志,则some_null
将为 1,否则为 0。
data mydata;
set mydata;
array flag_array flag: ;
some_null = nmiss(of flag_array[*]);
run;
请注意,在最新版本的 SAS 中,不需要数组长度的{*}
。
编辑:我想我误解了你的问题,你想要每列一个标志吗?看起来很乱,但我会这样做。
data mydata (drop=i);
set mydata;
array flag_array flag: ;
array null_flag [dim(flag_array)] ;
do i = 1 to dim(flag_array);
null_flag[i] = flag_array[i] = . ; /*shorter than if-else*/
end;
run;