假设你有三个独立的数据集,由相同数量的观测组成。每个观察都有一个ID字母an,后面跟着一些数值观察。例如:
数据集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我想通过第一个变量合并数据集。问题是,第一个变量还没有按字母排序,我不想按字母排序。我想要合并数据,但要保持原来的顺序。例如,我会得到:
合并数据:
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有办法这样做吗?
发布于 2014-09-26 03:05:02
您可以创建一个保存顺序的变量,然后在其“合并”后应用新的数据集。我相信这是一个附加,而不是合并。我使用了一种格式,不过您也可以使用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;发布于 2014-10-02 10:11:59
这只是一个SQL版本,它遵循与Joe的答案类似的路径。行顺序是通过子查询而不是格式输入的。但是,两个输入表的初始顺序在行顺序子查询的联接中丢失。通过使用表名作为次要顺序变量(have2跟随have1)重新安装原始顺序。
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;这是一个没有格式的数据步骤版本。这里,带有行顺序的have1表与连接的数据(have1和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;https://stackoverflow.com/questions/26049249
复制相似问题