对格式化值执行sas语句不是true值

时间:2015-11-24 23:55:53

标签: sas formats

我有一个带有两个格式化变量的数据集,一个是原始代码(代表一个国家的名称),另一个是将该代码转换为国家/地区的标准化代码。这两种都使用显示国家名称的格式。

我想输出格式化值不同的值,而不管真值。例如,如果我有以下数据(方括号中显示的格式):

obs    Country_raw[formatted value]        Country_std[formatted value]  
1      2211[Spain]                         3108[Spain]
2      9122[Zaire]                         9108[Democratic Republic of Congo]

对于两个记录,两个真值都不匹配,但我只想输出格式化值不匹配的第二个记录。

我试过

data diffs;
set countries;
format country_raw $CRAW.;
format country_std $CSACC.;
if country_raw ne country_std THEN OUTPUT;
run;

但这会使用真值。

我也尝试过使用proc print:

proc print data=countries;
format country_raw $CRAW.;  
format country_std $CSACC.;
where country_raw ne country_std;
run;

但这也符合真正的价值观。

2 个答案:

答案 0 :(得分:2)

在基础值上测试等式,而不是格式化值。

put(country_raw,$CRAW.) ^= put(country_std,$CSACC.)

作为你的条件。

put()函数将存储值中的值转换为格式化值。

答案 1 :(得分:2)

在数据步骤中,您可以使用VVALUE function,如下所示:

proc format;
  value countryF
  1='Spain'
  2='Zaire';
  value country2F
  4='Spain'
  6='Zaire'
  7='Morocco';
quit;

data have;
  input country_raw country_std;
  format country_raw COUNTRYF.
         country_std COUNTRY2F.;
  datalines;
1 4
2 7
;;;
run;

data want;
  set have;
  if vvalue(country_raw) = vvalue(country_std);
run;

VVALUE在PROC SQL环境中不可用(包括procs或数据步骤中的WHERE语句),但是,您需要使用PUT。 VVALUE的优点是您不需要知道特定字段上的格式名称是什么,以查看其格式化值。