将数据从一个表更新到另一个表

时间:2013-11-18 14:58:53

标签: sas

我有两张桌子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'列的格式和长度是否相同。

2 个答案:

答案 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将使用格式化的值强制它成为字符。