我有两张桌子TrimmedMeans和Need。两者都有一个名为node的ID列,其格式如下:
proc format lib=work; value $node_group (NOTSORTED)
'LW', 'WL'='LW/WL'
'LLW', 'LWL', 'LWW'='LLW/LW*'
'WLL', 'WLW', 'WWL'="WL*/WWL"
'LLLW', 'LLWL', 'LLWW','LWLL'='LLLW/LLW*/LWLL'
'LWLW', 'LWWL','LWWW','WLLL','WLLW','WLWL'='LWLW/LWW*/WLL*/WLWL'
'WLWW','WWLL','WWLW','WWWL'='WLWW/WWL*/WWWL'
;quit;
我按如下方式进行更新:
proc sort data=trimmedMeans out=trimmedMeans; by node; run;
proc sort data=need out=need; by node; run;
data need;
update need(in=H1) trimmedMeans(in=H2);
by node;
if(H1);
run;
但是,它仅更新名为“L”,“LLLLL”,“WWLW”等的节点的值。不会更新包含星号或正斜杠的节点。我已经尝试删除星号和正斜杠并用破折号替换它们,但无济于事。我应该逃避这些角色吗?我已经检查过两个表中'node'列的格式和长度是否相同。
答案 0 :(得分:2)
正如@Joe所指出的,可能是你在混合格式和价值观。如果两个数据集都存储了使用$ node_group格式化的基础值,则可以使用BY语句中的GROUPFORMAT选项通过格式化值更新/合并它们。此选项只能在数据步骤中使用,因此不适用于过程。这是一个如何工作的例子,希望它有所帮助。
proc format;
value $test 'A'-'I' = 'A-I'
'J'-'Q' ='J-Q'
'Q'-'Z' ='Q-Z';
run;
data have1;
input id $ val1;
format id test.;
datalines;
A 1
L 2
R 3
;
run;
data have2;
input id $ val1;
format id test.;
datalines;
D 10
P 20
Y 30
;
run;
data want;
update have1 (in=a) have2 (in=b);
by groupformat id;
run;
答案 1 :(得分:1)
听起来你有一个数据集包含应该对格式化结果进行评估的数据集,以及包含格式化结果的数据集。这不是格式如何工作。特别是,MERGE / UPDATE不尊重格式化值;他们只考虑潜在的价值观。因此,如果您希望MERGE / UPDATE在格式化值上合并,则需要将格式化结果输出到新变量。
从评论中,PROC TABULATE示例:
proc format;
value age
11-13 = '11-13'
14-16 = '14-16';
quit;
proc tabulate data=sashelp.class;
class age;
format age AGE.;
tables age*pctn;
ods output table=mydata;
run;
proc tabulate data=sashelp.class;
class age/mlf;
format age AGE.;
tables age*pctn;
ods output table=mydata;
run;
第一个proc tabulate
保留未格式化的值,并使用第一个值(我不确定它是遇到的第一个值还是第一个从最低到最高的值)。所以11和14是原始值。
使用proc tabulate
(多标签格式)的第二个mlf
将使用格式化的值强制它成为字符。