2011-04-14 75 views
5

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

+0

您无法在DATA步骤中真正有条件地创建变量。也许你想编写代码来检查一个数据集是否有一个特定的变量,如果不使用DATA步骤来创建一个新的数据集版本来添加所需的列并给它一些合理的默认值? – 2011-04-19 16:12:03

+0

如果输入数据不符合规格,更好的解决方案可能是“中止”。 – StasK 2015-10-23 15:34:33

回答

8

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; 
+2

使用open()函数打开数据集后,请不要忘记关闭()你的数据集。 – cmjohns 2011-04-16 15:53:53

+2

这里没有必要打开varnum和varnum吗?难道你不能说“数据try2; var4 = .; set try;”。在给出的例子中,它会在每次迭代时做开放和varnum,而不是很不情愿,所以它们至少应该被“if _N_ = 1 then”所保护。 – 2011-04-19 16:09:19

+2

我需要测试var4是否存在,以便保存它的内容。拟议的数据try2; VAR4 = .;设置尝试;'会覆盖预先存在的变量中的任何数据。 – Murray 2011-06-01 05:23:09

5
data try2; 
    set try; 
    var4 = coalesce(var4,.); 
run; 

(假设VAR4是数字)

1

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

0

这是一个非常晚的答案/评论,但是这种方法适用于我,而且非常简单(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; 
+0

这与AndyBean的回答相同。 – Snorex 2016-08-30 23:24:24

+0

如果Muray希望得到输入变量的变量不存在的信息,那么不应该这样做! – 2017-04-19 08:46:55