Sas PROC FREQ中的数值或PROC PRINT中的格式化值

Sas PROC FREQ中的数值或PROC PRINT中的格式化值,sas,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

我的情况似乎很容易解决。但是,我正在努力寻找一个优雅的解决方案。我得到了已经格式化的数据。类似于下面的玩具数据集

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

如果您知道格式名称,请使用
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;
然后,当您读取输出时,您知道变量实际具有的值。创建一个转换格式目录的程序非常简单。