Sas 测试变量是否存在

Sas 测试变量是否存在,sas,exists,Sas,Exists,我想测试变量是否存在,如果不存在,则创建它。可以使用open()&varnum()函数。varnum()的非零输出表示变量存在 data try; input var1 var2 var3; datalines; 7 2 2 5 5 3 7 2 7 ; data try2; set try; if _n_ = 1 then do; dsid=open('try'); if varnum(dsid,

我想测试变量是否存在,如果不存在,则创建它。

可以使用
open()
&
varnum()
函数。
varnum()
的非零输出表示变量存在

data try; 
    input var1 var2 var3;
    datalines;
    7 2 2
    5 5 3
    7 2 7
; 

data try2; 
    set try;
    if _n_ = 1 then do; 
        dsid=open('try'); 
        if varnum(dsid,'var4') = 0 then var4 = .; 
        rc=close(dsid);
    end;
    drop rc dsid;    
run;

(假设var4是数字的)

var4
分配给自身。如果变量不存在,赋值将创建该变量;如果变量存在,赋值将保留其内容

data try; 
    input var1 var2 var3;
    datalines;
    7 2 2
    5 5 3
    7 2 7
; 

data try2; 
    set try; 
    var4 = var4; 
run;

请记住,在不存在时以这种方式创建
var4
将使用默认的变量属性,因此,如果需要特定的格式/长度等,则可能需要使用显式的
attrib
语句。

这是一个非常晚的回答/注释,但此方法对我来说非常简单(SAS 9.4)。在下面的示例中,我使用了缺失的数字和字符变量,并为缺失的字符变量is missing赋值

    data try; 
input var1 var2 var3;
datalines;
7 2 2
5 5 3
7 2 7
; 

    data try2; 
length var4 $20;
length var5 8;
set try; 
var4 = var4; 
if var4 = ' ' then var4 = 'Not on Source File';
run;

使用
open()
函数打开数据集后,不要忘记
close()
数据集。这里不需要open和varnum,是吗?你不能直接说“data try2;var4=;set try;”。在给出的示例中,它会在每次迭代中执行open和varnum,效率很低,因此它们至少应该由“if\u N_uu2;=1 then”保护。我需要测试var4是否存在,以便在执行时保留其内容。建议的
数据try2;var4=。;集试
将覆盖预先存在的变量中的任何数据。由于您尝试在同一步骤中执行此操作,因此它实际上并不比其他答案更好。一旦编译器看到前面提到的
var4
,它就会在数据集中创建它。运行时发生的事情没有任何影响。您不能在数据步骤中真正有条件地创建变量。也许您想编写代码来检查数据集是否有特定的变量,如果没有,则使用数据步骤来创建数据集的新版本,添加所需的列并为其提供一些合理的默认值?更好的解决方案可能是
中止如果输入数据不符合规格。这与AndyBeanNot的上一个答案相同,如果Muray希望得到intput数据集上不存在变量的信息!此
创建变量
var4
,而不是测试它是否存在。您要测试的是变量(新的或旧的)是否为空。如果它不在输入数据集中,这将创建
var4
作为数字变量。是@Tom,这就是为什么如果默认数字为8,则可能需要显式attrib语句的原因。格式化变量不适合用户的需要。这很好。使用此选项,您可以指定所需的任何默认值。但是对于字符变量,在使用它之前仍然需要定义变量的长度。即使您首先在
coalescc()
函数调用中使用它,SAS也会默认将其创建为数字。
    data try; 
input var1 var2 var3;
datalines;
7 2 2
5 5 3
7 2 7
; 

    data try2; 
length var4 $20;
length var5 8;
set try; 
var4 = var4; 
if var4 = ' ' then var4 = 'Not on Source File';
run;