我有一个带有两个格式化变量的数据集,一个是原始代码(代表一个国家的名称),另一个是将该代码转换为国家/地区的标准化代码。这两种都使用显示国家名称的格式。
我想输出格式化值不同的值,而不管真值。例如,如果我有以下数据(方括号中显示的格式):
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;
但这也符合真正的价值观。
答案 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的优点是您不需要知道特定字段上的格式名称是什么,以查看其格式化值。