【发布时间】:2015-03-19 17:37:24
【问题描述】:
我有一个由 100 多个变量组成的 sas 数据集。变量pid - 字符变量和year - 数字变量标识数据集中的观察值。
如何创建一个由具有唯一 pid 和 year 组合的观察组成的新数据集。也就是说,如果给定的pid 和year 组合出现不止一次,我想删除所有相关的观察,而不仅仅是重复的。
【问题讨论】:
我有一个由 100 多个变量组成的 sas 数据集。变量pid - 字符变量和year - 数字变量标识数据集中的观察值。
如何创建一个由具有唯一 pid 和 year 组合的观察组成的新数据集。也就是说,如果给定的pid 和year 组合出现不止一次,我想删除所有相关的观察,而不仅仅是重复的。
【问题讨论】:
我不使用太多数据步骤。我使用 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 和 year。由于having count(1)<2,不会考虑任何多次出现的pid 和year。通过重新加入 pid 和 year,我只能从原始数据中获得这些观察结果。这实际上不需要排序。
如有任何问题,请告诉我。
【讨论】:
在数据步骤中简单地使用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;
【讨论】:
在 proc sort 中使用 UNIQUEOUT 和 NOUNIQUEKEY 选项来获得单步解决方案。
data class;
set sashelp.class;
run;
proc sort data=class nouniquekey uniqueout=unique_data;
by sex age;
run;
【讨论】:
您可以生成包含多次出现的 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;
【讨论】: