2016-01-08 301 views
0

希望得到一个直接的答案,但是如何确定变量是否具有多于一个的观察值等于最大值?例如,如果下面是我的数据:使用SAS中的最大值

ID  Doctor COUNT 
576434 Tim  1 
576434 Lynn 1 
576434 Moran 1 
576434 Wade 2 
576434 Ashwin 2 

望着变量“COUNT”,我们可以看到有两个观测等于最大值2.然后我会想将此“ID”,作为一个领带。数据已经按照ID和COUNT的顺序排列,所以我想也许只是看看最后两行中的值是否相等,但希望有更好的方法。谢谢!

回答

1

好吧,看看这个奇怪的解决方案...

首先,你的数据(有几行对它进行测试)

data have; 
format 
    ID 8. 
    Doctor $10. 
    COUNT 8.; 
input 
    @1 ID 8. 
    @8 Doctor $7. 
    @16 COUNT 8.; 
DATALINES; 
576434 Tim  1 
576434 Lynn 1 
576434 Moran 1 
576434 Wade 2 
576434 Ashwin 2 
111111 AAAAAA 1 
111111 BBBBBB 2 
111111 CCCCCC 3 
111111 DDDDDD 3 
111111 EEEEEE 3 
222222 ZZZZZZ 1 
222222 WWWWWW 2 
; 
RUN; 

proc sort data=have; 
by ID; 
run; 

创建一个数据集来帮助我们,选择仅计数> 1由ID

proc sql; 
CREATE TABLE AUX AS 
SELECT 
    ID 
    ,MAX(COUNT) AS AUXCOUNT 
FROM (
    SELECT 
     ID 
     ,COUNT 
     ,COUNT(*) AS COUNTOBS 
    FROM HAVE 
    GROUP BY 1,2 
    HAVING CALCULATED COUNTOBS > 1 
    ) 
GROUP BY 1 
ORDER BY 1; 
quit; 

那些最大值与所述第一数据集,以标志数据合并时,有一条领带:

data want; 
merge 
    have (in=a) 
    aux (in=b); 
by ID; 
if count = auxcount then TIEFLAG = "TIE"; 
else TIEFLAG = ""; 
drop auxcount; 
run; 

结果

ID  DOCTOR COUNT FLAG 
111111 AAAAAA 1 
111111 BBBBBB 2 
111111 CCCCCC 3 TIE 
111111 DDDDDD 3 TIE 
111111 EEEEEE 3 TIE 
222222 ZZZZZZ 1 
222222 WWWWWW 2 
576434 Tim 1 
576434 Lynn 1 
576434 Moran 1 
576434 Wade 2 TIE 
576434 Ashwin 2 TIE 
1

让我们假设你的数据集例如具有的缘故附加行:

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; 

两件事情是怎么回事:

  1. in=选项允许我们创建布尔变量告诉我们观察来自哪个数据集。换句话说,如果在dupes存在ID,变量dupmax = 1。如果存在于have的ID,则变量all = 1

  2. 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 
1

所以,很简单做到这一点的SQL。你甚至不需要排序。假设你的源数据集是“具有”作为提供的其他两个海报中的任何一个:

PROC SQL ; 

    CREATE TABLE dupemax AS 
    SELECT a.id, a.count, a.numobs 
    FROM (SELECT id, count, COUNT(*) AS numobs 
      FROM have 
      GROUP BY id, count 
     ) a  
     %* gives the number of rows with each id/count combination ; 
     INNER JOIN 
     (SELECT id, MAX(count) AS count 
      FROM have 
      GROUP BY id 
     ) b  
     %* finds the id/MAX(count) value ; 
     ON a.id EQ b.id AND a.count EQ b.count  
     %* so only getting the id and the MAX(count), not all "count" values ; 
    WHERE a.numobs GE 2  
    %* and of the id/MAX(count), only where there were multiple rows of the MAX(count) ; 
    ; 

QUIT ; 
相关问题