假设您有三个由相同数量的观察组成的独立数据集。每个观察都有一个ID字母,A-Z,然后进行一些数字观察。例如:
数据集1:
B 3 8 1 9 4
C 4 1 9 3 1
A 4 4 5 4 9
数据集2:
C 3 1 9 4 0
A 4 1 2 0 0
B 0 3 3 1 8
我想合并第一个变量的数据集BY。问题是,第一个变量尚未按字母顺序排序,我不想按字母顺序排序。我想合并数据但保留原始订单。例如,我会得到:
合并数据:
B 3 8 1 9 4
B 0 3 3 1 8
C 4 1 9 3 1
C 3 1 9 4 0
A 4 4 5 4 9
A 4 1 2 0 0
有没有办法做到这一点?
答案 0 :(得分:2)
您可以创建一个包含订单的变量,然后将新数据集应用于" merged"之后。我相信这是一个附加而不是合并。我已经使用了一种格式,但你也可以使用sql或数据集合并。
data have1;
input id $ var1-var5;
cards;
B 3 8 1 9 4
C 4 1 9 3 1
A 4 4 5 4 9
;
run;
data have2;
input id $ var1-var5;
cards;
C 3 1 9 4 0
A 4 1 2 0 0
B 0 3 3 1 8
;
run;
data order;
set have1;
fmtname='sort_order';
type='J';
label=_n_;
start=id;
keep id fmtname type label start;
run;
proc format cntlin=order;
run;
data want;
set have1 have2;
order_var=input(id, $sort_order.);
run;
proc sort data=want;
by order_var;
run;
答案 1 :(得分:0)
这只是一个SQL版本,它遵循与Joe的答案类似的路径。行顺序通过子查询而不是格式输入。但是,在行顺序子查询的连接中,两个输入表的初始顺序将丢失。通过使用表名作为二级顺序变量来重新设置原始顺序(has2跟随has1)。
proc sql;
create table want1 as
select want.id
,want.var1
,want.var2
,want.var3
,want.var4
,want.var5
from (
select *
, 'have1' as source
from have1
union all
select *
, 'have2' as source
from have2
) as want
left join
(
select id
, monotonic() as row_no
from have1
) as order
on want.id eq order.id
order by order.row_no
,want.source
;
quit;
proc compare
base=want1
compare=want
;
run;
这是没有格式的数据步骤版本。这里,带有行顺序的has1表与连接数据(has1和have2)重新合并,然后按行顺序重新排序。
data want2;
set have1 have2;
run;
data have1;
set have1;
order_var = _n_;
run;
proc sort data=want2;
by id;
run;
proc sort data=have1;
by id;
run;
data want2;
merge want2 have1;
by id;
run;
proc sort data=want2;
by order_var;
run;
proc compare
base=want2
compare=want
;
run;