使用SAS中的函数merge将A中的Common列值替换为B中的Common列值

使用SAS中的函数merge将A中的Common列值替换为B中的Common列值,sas,Sas,我想合并两个表,但它们在common中有两列,我不想用B中的值替换A中的var1,如果我们不使用drop或rename,有人知道吗? 我可以用sql修复它,但只是好奇合并 data a; infile datalines; input id1 $ id2 $ var1; datalines; 1 a 10 1 b 10 2 a 10 2 b 10 ; run; /* create table B */ data b; infile datalines; input id1 $ id2 $ var

我想合并两个表,但它们在common中有两列,我不想用B中的值替换A中的var1,如果我们不使用
drop
rename
,有人知道吗? 我可以用sql修复它,但只是好奇合并

data a;
infile datalines;
input id1 $ id2 $ var1;
datalines;
1 a 10
1 b 10
2 a 10
2 b 10
;
run;
/* create table B */
data b;
infile datalines;
input id1 $ id2 $ var1  var2;
datalines;
1 a 30 50
2 b 30 50
;
run; 
/* Marge A and B */
data c;
merge a (in=N) b(in=M);
if N;
by id1;
run;
但我喜欢的是:

data C;
infile datalines;
input id1 $ id2 $ var1 var2;
datalines;
1 a 10 50
1 b 10 50
2 a 10 50
2 b 10 50
;
run;
使用重命名

data c; 
 merge a (in=N) b(in=M rename=(var1=var1_2));
 by id1;
 if N;
run;
如果不想使用rename/drop等,则可以翻转合并顺序,以便应保留var1的数据集覆盖其他数据集:

data c; 
 merge b (in=M) a(in=N);
 by id1;
 if N;
run;

当数据步骤从前面提到的数据集中加载数据时,它会按照它们在MERGE(或SET或UPDATE)语句中出现的顺序执行。因此,如果要合并两个数据集,且BY变量与值匹配,则加载第一个数据集的记录,加载第二个数据集的记录,覆盖从第一个数据集读取的值

对于1对1匹配,您只需更改提及数据集的顺序即可

merge b(in=M) a(in=N) ;
如果您确实希望输出数据集中定义的变量按照它们在合并语句中出现的顺序出现,那么可以添加一个SET语句,编译器将处理该语句,但在MERGE语句之前永远不能执行该语句

if 0 then set a b ;
如果您正在进行1对多匹配,那么您可能会遇到其他问题,因为当数据集停止按组为当前提供值时,SAS不会重新读取上一个观察值。在这种情况下,您必须使用RENAME=、DROP=或KEEP=数据集选项的某些组合


在PROC SQL中,如果选定列的名称重复(并且尝试创建输出数据集而不是报表),则SAS将忽略命名变量的第二个副本。因此,从某种意义上讲,它与MERGE语句的情况相反。

我不明白您的要求是什么?只需更改MERGE语句中数据集的顺序。将要“赢得”其值的数据集放在最后。
if 0 then set a b ;