让我们假设你的数据集例如具有的缘故附加行:
data have;
input ID Doctor$ Count;
datalines;
576434 Tim 1
576434 Lynn 1
576434 Moran 1
576434 Wade 2
576434 Ashwin 2
576435 Barry 8
576435 Jim 10
576435 Bart 10
576391 Tom 1
576391 Bill 2
run;
步骤1:排序数据集的ID,降计数
proc sort data=have;
by ID descending count;
run;
我们现在将原始数据集按照我们可以使用的顺序放入。接下来,我们将删除重复的最大条目。
步骤2:删除ID 重复降计数
proc sort data=have
out=_temp_
dupout=dupes
nodupkey;
by ID descending count;
run;
我们不关心从proc sort
输出数据集,但我们关心的dupout
数据集。
Dupes
ID Doctor Count
576434 Ashwin 2 <---- Duplicate max
576434 Lynn 1
576434 Moran 1
576435 Bart 10 <---- Duplicate max
步骤3:挑选出重复
注意,每个ID
组的开始是最大重复的值。由于它是按ID排序的,然后按降序计数,dupout
数据集中每个ID
组的第一个条目将使我们获得每个重复最大值的实例。因为所有东西都按proc sort
排序,所以这个技巧将无误地运行。
data dupe_max;
set dupes;
by ID descending count;
if(first.ID);
keep ID;
run;
第4步:合并这些ID回到与原来的分类数据集
data want;
merge dupes(in=dupmax)
have(in=all);
by ID;
Duplicate_Max = (have=dupes);
run;
两件事情是怎么回事:
的in=
选项允许我们创建布尔变量告诉我们观察来自哪个数据集。换句话说,如果在dupes
存在ID,变量dupmax
= 1。如果存在于have
的ID,则变量all
= 1
variable = (logic here)
是创建布尔变量1/0
的简略方式。您可以通过执行获得相同的结果:
if(have=dupes) then Duplicate_Max = 1; else Duplicate_Max = 0;
在幕后,这是发生了什么事:
ID from have ID from dupes
vvv vvvvvv
ID Doctor Count Duplicate_Max all dupmax Match?
576391 Bill 2 0 1 0 No
576391 Tom 1 0 1 0 No
576434 Wade 2 1 1 1 Yes
576434 Ashwin 2 1 1 1 Yes
576434 Tim 1 1 1 1 Yes
576434 Lynn 1 1 1 1 Yes
576434 Moran 1 1 1 1 Yes
576435 Jim 10 1 1 1 Yes
576435 Bart 10 1 1 1 Yes
576435 Barry 8 1 1 1 Yes