在 SAS 中使用各种条件删除重复项
Removing duplicates using various condition in SAS
我有如下数据集
Id Site Date
1 A 01-01-2021
1 A 02-02-2021
1 A 08-06-2021
1 A 09-06-2021
2 B 03-03-2021
2 B 08-05-2021
2 B 10-07-2021
2 B 15-07-2021
在上面的数据集中,我想根据几个条件删除重复项-
1.If 日期小于 08JUNE2021 并且网站是 A 然后保留最近日期的 id
2.If 日期大于 2021 年 6 月 8 日并且网站是 A 然后保持 id 为最近的日期
3.If 日期小于 2021 年 7 月 9 日并且网站是 B 然后保持 ID 为最近的日期
4.If 日期大于 2021 年 7 月 9 日并且站点是 B 保持 ID 为最新日期
下面给出我想要的条件数据集后
Id site Date
1 A 02-02-2021
1 A 09-06-2021
2 B 08-05-2021
2 B 15-07-2021
我试过数据的代码
proc sql; create table want as select * from (select ,count() as count, case when count()>1 and Date>"07JUN2021"d then 1 when count()>1 and Date<"07JUN2021"d then 2 else count(*) end as flag from z group by id) where site="A"; quit; run;
我喜欢的一种方法是创建一个 'group' 变量,让您可以识别分组。在这里,我展示了如何使用信息格式来做到这一点。如果您始终只有两个组('before' 日期和 'after' 日期),这是一个很好的方法;如果您有两个以上的组,还有其他选择。另请注意,我假设您的意思是小于和(不小于);如果您确实想明确排除站点 A 的 6 月 8 日记录,则需要进行一些调整。
data have;
input Id Site $ Date :ddmmyy10.;
format date date9.;
datalines;
1 A 01-01-2021
1 A 02-02-2021
1 A 08-06-2021
1 A 09-06-2021
2 B 03-03-2021
2 B 08-05-2021
2 B 10-07-2021
2 B 15-07-2021
;;;;
run;
*Create an informat that maps each site to the pivot date;
proc format;
invalue site_datei
'A' = '08JUN2021'd
'B' = '09JUL2021'd
;
run;
* Now compare the date to the pivot date for that site, and assign group based on that result;
data for_sort;
set have;
group = ifn(date lt input(site,site_datei.),1,2);
run;
现在您可以做很多事情来获得每组的最大值 - 这是一个 SQL 解决方案,因为您似乎更喜欢它。
proc sql;
select id, site, group, max(date) format=date9. from for_sort group by id, site, group;
quit;
这可以在单个 SQL 查询中完成,但我建议不要这样做,除非有重大的性能考虑(在这种情况下,我什至更强烈建议不要 SQL!)。
我有如下数据集
Id Site Date
1 A 01-01-2021
1 A 02-02-2021
1 A 08-06-2021
1 A 09-06-2021
2 B 03-03-2021
2 B 08-05-2021
2 B 10-07-2021
2 B 15-07-2021
在上面的数据集中,我想根据几个条件删除重复项- 1.If 日期小于 08JUNE2021 并且网站是 A 然后保留最近日期的 id
2.If 日期大于 2021 年 6 月 8 日并且网站是 A 然后保持 id 为最近的日期
3.If 日期小于 2021 年 7 月 9 日并且网站是 B 然后保持 ID 为最近的日期
4.If 日期大于 2021 年 7 月 9 日并且站点是 B 保持 ID 为最新日期
下面给出我想要的条件数据集后
Id site Date
1 A 02-02-2021
1 A 09-06-2021
2 B 08-05-2021
2 B 15-07-2021
我试过数据的代码
proc sql; create table want as select * from (select ,count() as count, case when count()>1 and Date>"07JUN2021"d then 1 when count()>1 and Date<"07JUN2021"d then 2 else count(*) end as flag from z group by id) where site="A"; quit; run;
我喜欢的一种方法是创建一个 'group' 变量,让您可以识别分组。在这里,我展示了如何使用信息格式来做到这一点。如果您始终只有两个组('before' 日期和 'after' 日期),这是一个很好的方法;如果您有两个以上的组,还有其他选择。另请注意,我假设您的意思是小于和(不小于);如果您确实想明确排除站点 A 的 6 月 8 日记录,则需要进行一些调整。
data have;
input Id Site $ Date :ddmmyy10.;
format date date9.;
datalines;
1 A 01-01-2021
1 A 02-02-2021
1 A 08-06-2021
1 A 09-06-2021
2 B 03-03-2021
2 B 08-05-2021
2 B 10-07-2021
2 B 15-07-2021
;;;;
run;
*Create an informat that maps each site to the pivot date;
proc format;
invalue site_datei
'A' = '08JUN2021'd
'B' = '09JUL2021'd
;
run;
* Now compare the date to the pivot date for that site, and assign group based on that result;
data for_sort;
set have;
group = ifn(date lt input(site,site_datei.),1,2);
run;
现在您可以做很多事情来获得每组的最大值 - 这是一个 SQL 解决方案,因为您似乎更喜欢它。
proc sql;
select id, site, group, max(date) format=date9. from for_sort group by id, site, group;
quit;
这可以在单个 SQL 查询中完成,但我建议不要这样做,除非有重大的性能考虑(在这种情况下,我什至更强烈建议不要 SQL!)。