我需要合并两个数据集。每个数据集包含一个连续的观察数。第一个数据集仅包含第一个观察结果。第二个数据集包含所有后续观察。并非所有受试者都有相同数量的观察结果。
问题如下。有两种不同类型的主题。该类型仅包含在第一个数据集中。当我将两个数据集合并在一起时,所有观察结果都缺少类型,但每个主题都是第一个。请参阅下面的示例。
我想知道如何使用SQL和DATA步骤执行此操作。我的实际数据集并不大,因此处理效率不是主要问题。
我尝试过使用RETAIN
,但由于第二个数据集不包含TYPE
变量,因此没有值可以保留。关于SQL,似乎UNION
应该有效,并且互联网上有无数UNION
的例子,但它们都涉及一个变量。我需要知道如何在保留Observation
并分配ID
的同时Amount
Type
变量data set1;
input ID $
Observation
Type $
Amount
;
datalines;
002 1 A 15
026 1 A 30
031 1 B 7
028 1 B 10
036 1 A 22
;
run;
data set2;
input ID $
Observation
Amount
;
datalines;
002 2 11
002 3 35
002 4 13
002 5 12
026 2 21
026 3 12
026 4 40
031 2 11
028 2 27
036 2 10
036 3 15
036 4 16
036 5 12
036 6 20
;
run;
proc sort data = set1;
by ID
Observation
;
run;
proc sort data = set2;
by ID
Observation
;
run;
data merged;
merge set1
set2
;
by ID
Observation
;
run;
。{/ p>
示例
ID Observation Type Amount
002 1 A 15
002 2 11
002 3 35
002 4 13
002 5 12
026 1 A 30
026 2 21
026 3 12
026 4 40
028 1 B 10
028 2 27
031 1 B 7
031 2 11
036 1 A 22
036 2 10
036 3 15
036 4 16
036 5 12
036 6 20
这给出了
ID Observation Type Amount
002 1 A 15
002 2 A 11
002 3 A 35
002 4 A 13
002 5 A 12
026 1 A 30
026 2 A 21
026 3 A 12
026 4 A 40
028 1 B 10
028 2 B 27
031 1 B 7
031 2 B 11
036 1 A 22
036 2 A 10
036 3 A 15
036 4 A 16
036 5 A 12
036 6 A 20
然而,我需要的是
log2(n)
答案 0 :(得分:0)
我确定还有其他方法可以做到这一点,但这就是我的做法。
首先,堆叠数据只保留公共字段。
data new;
set set1 (drop = TYPE) set2;
run;
然后重新合并类型字段。
proc sql;
create table new2 as select
a.*,
b.TYPE
from new a
left join set1 b
on a.id=b.id;
quit;
答案 1 :(得分:0)
Proc SQL:
proc sql;
create table want as
select coalesce(a.id,b.id) as id,observation,type,amount from (select * from set1(drop=type) union
select * from set2) a left join set1 (keep=id type) b
on a.id=b.id;
quit;
答案 2 :(得分:0)
DATA步骤方法很简单,只需使用SET
和BY
来交错记录。您需要创建一个NEW变量来保留值。如果您愿意,可以删除旧的并重命名新的名称。
data want ;
set set1 set2 ;
by id ;
if first.id then new_type=type;
retain new_type;
run;
对于SQL,使用@JJFord3发布的方法首先联合公共字段,然后合并TYPE标志。您可以合并为一个语句。
proc sql;
create table want as
select a.*,b.type
from
(select id,observation,amount from set1
union
select id,observation,amount from set2
) a
left join set1 b
on a.id = b.id
order by 1,2
;
quit;