【问题标题】:Test if a variable exists测试变量是否存在
【发布时间】:2011-08-05 03:41:45
【问题描述】:

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

【问题讨论】:

  • 您不能真正有条件地在 DATA 步中创建变量。也许您想编写代码来检查数据集是否具有特定变量,如果没有,则使用 DATA 步骤创建数据集的新版本,添加所需的列并为其提供一些合理的默认值?
  • 如果输入数据不符合规范,更好的解决方案可能是abort;

标签: sas exists


【解决方案1】:

可以使用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;

【讨论】:

  • open()函数打开你的数据集后别忘了close()
  • 这里不需要 open 和 varnum 是吗?你不能只说“data try2; var4=.; set try;”。在给出的示例中,它会在每次迭代时执行 open 和 varnum,相当低效,因此它们至少应该由“if _N_=1 then”保护。
  • 我需要测试 var4 是否存在,以便在存在时保留其内容。提议的data try2; var4=.; set try; 将覆盖预先存在的变量中的任何数据。
  • 由于您尝试在同一步骤中执行此操作,因此它确实不比其他答案好。一旦编译器看到提到的var4,它就会在数据集中创建它。运行时发生的事情没有影响。
【解决方案2】:
data try2;
    set try;
    var4 = coalesce(var4,.);
run;

(假设 var4 是数字)

【讨论】:

  • 这很好。有了这个,您可以分配您想要的任何默认值。但是对于字符变量,您仍然需要在使用它之前定义变量的长度。即使您首先在 coalescec() 函数调用中使用它,SAS 也会默认将其创建为数字。
【解决方案3】:

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 语句。

【讨论】:

  • 如果 var4 不在输入数据集中,这将创建一个数字变量。
  • 是的@Tom,这就是为什么如果默认数字 8. 格式化变量不适合用户需要,则可能需要明确的属性声明。
【解决方案4】:

这是一个非常晚的答案/评论,但这种方法对我有用并且非常简单(SAS 9.4)。在下面的示例中,我使用了缺失的数字和字符变量,并为缺失的字符变量分配了一个值。

    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;

【讨论】:

  • 这和AndyBean之前的回答是一样的
  • 如果 Muray 想知道 intput deataset 上的变量不存在,则不要!
  • 这个creates 变量var4 而不是测试它是否存在。您正在测试的是变量(新的或旧的)是否为空。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-07
相关资源
最近更新 更多