2017-03-18 73 views
0

我有一种看起来应该很容易修复的情况。但是,我正在努力寻找一个优雅的解决方案。我收到了已经格式化的数据。类似于下面的玩具数据集。PROC FREQ中的数值或PROC中的格式值PRINT

proc format; 
    value x1_f 1 = "Yes" 
        0 = "No"; 
    value x2_f 1 = "Yes" 
        2 = "No"; 
run; 

data ds; 
    input x1 x2; 
    datalines; 
    1 2 
    1 1 
    0 1 
    ; 

data ds; 
    set ds; 
    format x1 x1_f. 
      x2 x2_f.; 
run; 

现在,作为我的数据管理过程的一部分,我使用x1和x2创建了一个2x2表。假设我正在检查我的数据,并期望x1和x2始终同意。

proc freq data = ds; 
    tables x1*x2; 
run; 

当我看到报告时,我注意到x1和x2并不总是同意。所以,我想打印出不同意观察的观察结果,看看我是否能够弄清楚可能发生了什么。因为这是一个玩具的例子,所以没有其他变量可以看,但希望你能明白。

proc print data = ds; 
    where x1 = "Yes" & x2 = "No"; 
run; 

SAS使我有以下错误:

ERROR: WHERE clause operator requires compatible variables 

好吧,我想我需要给SAS的数值,而不是格式化的值。但是,当我查看之前的PROC FREQ报告时,它只显示格式化的值。所以,我运行另一个PROC FREQ。

proc freq data = ds; 
    tables x1*x2; 
    format x1 x2; 
run; 

现在我可以看到哪个变量使用0和1,哪个变量使用1和2。

proc print data = ds; 
    where x1 = 0 & x2 = 1; 
run; 

最后,我得到了我在找的东西。这看起来真的很笨重和不雅。有人可以告诉我如何在我的频率报告中同时查看我的数值和格式化值,或者如何在proc打印中使用格式化值?

回答

0

如果知道格式名称,则可以使用WHERE语句中的PUT()函数。

proc print data=sashelp.class ; 
    where put(age,2.) = '12'; 
run; 

如果您不知道格式名称,那么您可以使用VVALUE()函数。但是你可能需要添加一个数据步骤才能工作。

data to_print; 
    set sashelp.class ; 
    if strip(vvalue(age))='12'; 
run; 
proc print data=to_print; 
run; 

在过去,我过去只是创建一个单独的格式目录,格式包含标签中的值。

proc format; 
    value x1_f 1 = "1=Yes" 0 = "0=No"; 
run; 

然后当你读你的输出时,你知道变量实际上有的值。创建一个程序来转换格式目录非常简单。 http://github.com/sasutils/macros/blob/master/cfmtgen.sas