选择独特的案例

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);