选择独特的案例
Selecting unique cases
我有一个数据集 work.test1,它由 4 个变量 hhid(家庭 ID)、pid(个人 ID)、pidlink(hhid 和 pid 的组合)和 bin(正或负)组成。
示例数据如下所示:
obs hhid pid pidlink bin
1 10600 1 1060001 1
2 10600 1 1060001 1
3 10800 1 1080001 1
4 10800 1 1080001 1
5 10800 2 1080002 1
6 10800 2 1080002 2
7 12200 1 1220001 1
8 12200 1 1220001 2
现在我想创建一个数据集 work.test2,它应该只包含唯一的 hhid,它是 bin 2(如果家庭中有 bin=2)或 bin 1(如果家庭中没有 bin 2)家庭)。如果有超过 1 个 bin=2,我会选择第一个。如果没有 bin 2 但有超过 1 个 bin 1,我会选择第一个。生成的数据集应该只有唯一的 hhid(每个家庭一个条目)。
结果输出应如下所示:
obs hhid pid pidlink bin
1 10600 1 1060001 1
2 10800 2 1080001 2
3 12200 1 1220001 2
谢谢
就显示的数据和输出而言,group by 和 max 函数应该可以工作并给出我想要的结果。
data have(drop =obs);
input obs hhid pid pidlink bin;
datalines;
1 10600 1 1060001 1
2 10600 1 1060001 1
3 10800 1 1080001 1
4 10800 1 1080001 1
5 10800 2 1080002 1
6 10800 2 1080002 2
7 12200 1 1220001 1
8 12200 1 1220001 2
;
proc sql;
select hhid, max(pid) as pid, max(pidlink) as pidlink, max(bin) as bin
from have
group by 1;
如果你有更多的列,那么它会变得有点棘手,但你可以做到,但同样你需要更多的选择,否则你会得到更多的记录。请参阅下面的查询
data have(drop =obs);
input obs hhid pid pidlink bin anotherval1 abotherval2 $;
datalines;
1 10600 1 1060001 1 7 A
2 10600 1 1060001 1 8 B
3 10800 1 1080001 1 6 C
4 10800 1 1080001 1 8 D
5 10800 2 1080002 1 8 E
6 10800 2 1080002 2 9 F
7 12200 1 1220001 1 10 G
8 12200 1 1220001 2 7 H
;
proc sql;
select * from have
group by 1
having pid= max(pid)
and pidlink = max(pidlink)
and bin = max(bin) ;
如果您只想拥有带有附加列的不同记录,那么
data have1;
set have;
val =_n_;
run;
proc sql;
create table have2(drop =val) as
select * from
(select * from have1
group by 1
having pid= max(pid)
and pidlink = max(pidlink)
and bin = max(bin))a
group by hhid, pid, pid,bin
having val=min(val);
我有一个数据集 work.test1,它由 4 个变量 hhid(家庭 ID)、pid(个人 ID)、pidlink(hhid 和 pid 的组合)和 bin(正或负)组成。
示例数据如下所示:
obs hhid pid pidlink bin
1 10600 1 1060001 1
2 10600 1 1060001 1
3 10800 1 1080001 1
4 10800 1 1080001 1
5 10800 2 1080002 1
6 10800 2 1080002 2
7 12200 1 1220001 1
8 12200 1 1220001 2
现在我想创建一个数据集 work.test2,它应该只包含唯一的 hhid,它是 bin 2(如果家庭中有 bin=2)或 bin 1(如果家庭中没有 bin 2)家庭)。如果有超过 1 个 bin=2,我会选择第一个。如果没有 bin 2 但有超过 1 个 bin 1,我会选择第一个。生成的数据集应该只有唯一的 hhid(每个家庭一个条目)。
结果输出应如下所示:
obs hhid pid pidlink bin
1 10600 1 1060001 1
2 10800 2 1080001 2
3 12200 1 1220001 2
谢谢
就显示的数据和输出而言,group by 和 max 函数应该可以工作并给出我想要的结果。
data have(drop =obs); input obs hhid pid pidlink bin; datalines; 1 10600 1 1060001 1 2 10600 1 1060001 1 3 10800 1 1080001 1 4 10800 1 1080001 1 5 10800 2 1080002 1 6 10800 2 1080002 2 7 12200 1 1220001 1 8 12200 1 1220001 2 ;
proc sql;
select hhid, max(pid) as pid, max(pidlink) as pidlink, max(bin) as bin
from have
group by 1;
如果你有更多的列,那么它会变得有点棘手,但你可以做到,但同样你需要更多的选择,否则你会得到更多的记录。请参阅下面的查询
data have(drop =obs); input obs hhid pid pidlink bin anotherval1 abotherval2 $; datalines; 1 10600 1 1060001 1 7 A 2 10600 1 1060001 1 8 B 3 10800 1 1080001 1 6 C 4 10800 1 1080001 1 8 D 5 10800 2 1080002 1 8 E 6 10800 2 1080002 2 9 F 7 12200 1 1220001 1 10 G 8 12200 1 1220001 2 7 H ;
proc sql;
select * from have
group by 1
having pid= max(pid)
and pidlink = max(pidlink)
and bin = max(bin) ;
如果您只想拥有带有附加列的不同记录,那么
data have1;
set have;
val =_n_;
run;
proc sql;
create table have2(drop =val) as
select * from
(select * from have1
group by 1
having pid= max(pid)
and pidlink = max(pidlink)
and bin = max(bin))a
group by hhid, pid, pid,bin
having val=min(val);