对格式化值执行 sas 语句而不是真实值

Performing sas statements on formatted values not true value

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

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

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;

但这也适用于真实值。

相等性是在基础值而不是格式化值上测试的。

尝试

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

根据你的情况。

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

在数据步骤中,您可以使用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 的优点是您无需知道特定字段的格式名称即可查看其格式化值。