如何使用唯一键创建SAS数据集提取观察

时间:2015-03-19 17:37:25

标签: sql sas

我有一个sas数据集,包含100多个变量。变量pid - 一个字符变量和year - 一个数值变量,用于标识数据集中的观察值。

如何创建由具有唯一pidyear组合的观察组成的新数据集。也就是说,如果给定的pidyear组合不止一次出现,我想删除所有相关的观察结果,而不仅仅是重复的结果。

4 个答案:

答案 0 :(得分:3)

我没有使用太多的数据步骤。我使用proc sql对我来说很容易。

proc sql;
    create table new_dataset as
    select * from old_dataset as a
      join
    (select pid, year, count(1) from old_dataset group by pid, year having count(1)<2)
    as b on a.pid=b.pid and a.year=b.year;
run;

内部查询只获得一次发生的pid和年份。由于having count(1)<2,不会考虑任何多次出现的pid和year。我只是通过加入pid和year来获得那些观察结果。这实际上不需要排序。

如有任何问题,请告诉我。

答案 1 :(得分:2)

在数据步骤中简单使用first.last.即可。如果数据尚未按照pid和年份排序,请运行proc sort

proc sort data=have;
by pid year;
run;

data want;
set have;
by pid year;
if first.year and last.year then output; /* only keep unique rows */
run;

答案 2 :(得分:2)

在proc sort中使用UNIQUEOUT和NOUNIQUEKEY选项来获得单步解决方案。

data class;
set sashelp.class;
run;

proc sort data=class nouniquekey uniqueout=unique_data;
by sex age;
run;

http://support.sas.com/documentation/cdl/en/proc/65145/HTML/default/viewer.htm#p0qh2iuz3fa6rpn1eib1gaxr0sb5.htm

答案 3 :(得分:1)

您可以生成包含多次出现的pid和year组合的数据集,然后将其与其余部分合并以删除匹配项:

proc sort data = have nodupkey dupout = duplicates;
    by pid year;
run;

data want;
    merge have 
          duplicates(in = a keep = pid year);
    by pid year;
    if not(a);
run;