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

Sas 将数据从一个表更新到另一个表,sas,Sas,我有两张桌子,需要和需要。两者都有一个名为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'

我有两张桌子,需要和需要。两者都有一个名为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”列的格式和长度是否相同。

听起来您有一个数据集,其中包含的内容应计算为格式化结果,另一个数据集包含格式化结果。格式的工作原理并非如此。特别是,合并/更新不尊重格式化值;他们只考虑潜在价值。因此,如果希望合并/更新在格式化值上合并,则需要将格式化结果放入新变量

从注释中,可以看到一个PROC表格示例:

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 tablate
保留未格式化的值,并使用第一个值(我不确定它是遇到的第一个值还是排序从低到高的第一个值)。所以11和14是原始值。
第二个
proc tablate
mlf
(多标签格式)将使用格式化的值强制其为字符。

正如@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;

如果我的答案不是你的问题的全部,你应该提供一些你如何展示的样本数据和样本结果。这听起来像是个问题。如果我在PROC TABLATE中使用一种基于上述格式的格式来聚合数据,我如何才能将原始聚合数据而不是应用于该数据集的格式的数据聚合到数据集中?这取决于您的PROC TABLATE详细信息。如果您只是使用一个常规的class语句,那么您可能仍然会使用带有格式化值的第一个条目来获取原始数据。不过,“原始聚合”数据对合并没有帮助,因为它只是合并生成合并值的值之一——在我上面的示例中,所有11-13在表格结果中都变成了11。我将发布另一个问题和一些示例数据来解释发生了什么。很好,我忘记了这个选项。