SAS 宏,用于根据另一个变量的 Null 条件创建二进制变量



我有一个包含 300 多个变量的数据集,其中许多数值变量都有很多空值。我想为每个变量创建一个额外的二进制变量,该变量将说明该变量是否为空。

数据示例

  1. 身份证No_of_Visit No_of_PurchaseFlag_Null_No_Of_Visit Flag_Null_No_Of_Purchase
  2. 1 5 5 0 0
  3. 2 12 1 0 0
  4. 3 10 . 0 1
  5. 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;

相关内容

  • 没有找到相关文章

最新更新