PROC PRRE中的数字值或PROC PRINT

时间:2017-03-18 23:53:56

标签: sas

我的情况似乎应该很容易修复。但是,我很难找到一个优雅的解决方案。我得到了已经格式化的数据。与下面的玩具数据集类似。

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 print中使用格式化值?

1 个答案:

答案 0 :(得分:0)

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

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