请选择 进入手机版 | 继续访问电脑版
楼主: mich_ard
14107 7

[原创博文] SAS笔记 1:数据集分组并在各组内排名 [推广有奖]

  • 0关注
  • 2粉丝

本科生

46%

还不是VIP/贵宾

-

威望
0
论坛币
69 个
通用积分
2.0088
学术水平
18 点
热心指数
18 点
信用等级
17 点
经验
1203 点
帖子
63
精华
0
在线时间
114 小时
注册时间
2016-10-12
最后登录
2017-11-10

mich_ard 发表于 2016-12-11 15:45:31 |显示全部楼层 |坛友微信交流群

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币

为简明起见,我以sashelp.class 为例,
介绍如何对对数据集按性别分成男、女两组,并按身高(height)从矮到高排列。

sashelp.class 原表如下:
                        

Obs    Name       Sex    Age    Height    Weight
   1    Joyce       F      11     51.3       50.5
   2    Louise      F      12     56.3       77.0
   3    Alice       F      13     56.5       84.0
   4    Jane        F      12     59.8       84.5
   5    Janet       F      15     62.5      112.5
   6    Carol       F      14     62.8      102.5
   7    Judy        F      14     64.3       90.0
   8    Barbara     F      13     65.3       98.0
   9    Mary        F      15     66.5      112.0
  10    James       M      12     57.3       83.0
  11    Thomas      M      11     57.5       85.0
  12    John        M      12     59.0       99.5
  13    Jeffrey     M      13     62.5       84.0
  14    Henry       M      14     63.5      102.5
  15    Robert      M      12     64.8      128.0
  16    William     M      15     66.8      112.0
  17    Ronald      M      15     67.0      133.0
  18    Alfred      M      14     69.0      112.5
  19    Philip      M      16     72.0      150.0


方法1,first.variable

data test1;
set sashelp.class;
proc sort;
by sex height;
run;

data test2;
set test1;
by sex;
if first.sex then rank_h1 = 0;
rank_h1 + 1 ;
drop age weight;
run;

                           Obs    Name       Sex    Height    rank_h1
                             1    Joyce       F      51.3         1
                             2    Louise      F      56.3         2
                             3    Alice       F      56.5         3
                             4    Jane        F      59.8         4
                             5    Janet       F      62.5         5
                             6    Carol       F      62.8         6
                             7    Judy        F      64.3         7
                             8    Barbara     F      65.3         8
                             9    Mary        F      66.5         9
                            10    James       M      57.3         1
                            11    Thomas      M      57.5         2
                            12    John        M      59.0         3
                            13    Jeffrey     M      62.5         4
                            14    Henry       M      63.5         5
                            15    Robert      M      64.8         6
                            16    William     M      66.8         7
                            17    Ronald      M      67.0         8
                            18    Alfred      M      69.0         9
                            19    Philip      M      72.0        10


方法2,proc rank

data test1;
set sashelp.class;
proc sort;
by sex height;
run;

proc rank data=test1 out=test3 (drop=age weight) ;
var height;
by sex;
ranks Mingci;
run;

                           Obs    Name       Sex    Height    Mingci
                             1    Joyce       F      51.3       1
                             2    Louise      F      56.3        2
                             3    Alice       F      56.5        3
                             4    Jane        F      59.8        4
                             5    Janet       F      62.5        5
                             6    Carol       F      62.8        6
                             7    Judy        F      64.3        7
                             8    Barbara     F      65.3        8
                             9    Mary        F      66.5        9
                            10    James       M      57.3       1
                            11    Thomas      M      57.5        2
                            12    John        M      59.0        3
                            13    Jeffrey     M      62.5        4
                            14    Henry       M      63.5        5
                            15    Robert      M      64.8        6
                            16    William     M      66.8        7
                            17    Ronald      M      67.0        8
                            18    Alfred      M      69.0        9
                            19    Philip      M      72.0       10


方法3,proc sql

proc sql;
    select a.sex, a.name, a.height, (select count(distinct b.height)
            from sashelp.class b where b.height >= a.height and a.sex = b.sex ) as rank_height
    from sashelp.class a
    order by sex, rank_height;
quit;

                              Sex  Name        Height  rank_height
                              F    Mary          66.5            1
                              F    Barbara       65.3            2
                              F    Judy          64.3            3
                              F    Carol         62.8            4
                              F    Janet         62.5            5
                              F    Jane          59.8            6
                              F    Alice         56.5            7
                              F    Louise        56.3            8
                              F    Joyce         51.3            9
                              M    Philip          72            1
                              M    Alfred          69            2
                              M    Ronald          67            3
                              M    William       66.8            4
                              M    Robert        64.8            5
                              M    Henry         63.5            6
                              M    Jeffrey       62.5            7
                              M    John            59            8
                              M    Thomas        57.5            9
                              M    James         57.3           10


==================

如果不要求男女分组,来个全班总排名,稍有不同:

用自动变量_N_ :

data test5;
set sashelp.class;
proc sort;
by height;
run;

data test6;
set test5;
by height;
tot_ranking=_N_ ;
drop age weight;
run;
                                                                tot_
                           Obs    Name       Sex    Height    ranking
                             1    Joyce       F      51.3         1
                             2    Louise      F      56.3         2
                             3    Alice       F      56.5         3
                             4    James       M      57.3         4
                             5    Thomas      M      57.5         5
                             6    John        M      59.0         6
                             7    Jane        F      59.8         7
                             8    Janet       F      62.5         8
                             9    Jeffrey     M      62.5         9
                            10    Carol       F      62.8        10
                            11    Henry       M      63.5        11
                            12    Judy        F      64.3        12
                            13    Robert      M      64.8        13
                            14    Barbara     F      65.3        14
                            15    Mary        F      66.5        15
                            16    William     M      66.8        16
                            17    Ronald      M      67.0        17
                            18    Alfred      M      69.0        18
                            19    Philip      M      72.0        19


或者:

proc sql;
    select a.name, a.sex, a.height, (select count(distinct b.height)
            from sashelp.class b where b.height <= a.height) as H_ranking
    from sashelp.class a
    order by H_ranking;
quit;

(注意,有两个第8名)
                               Name      Sex    Height  H_ranking
                               Joyce     F        51.3          1
                               Louise    F        56.3          2
                               Alice     F        56.5          3
                               James     M        57.3          4
                               Thomas    M        57.5          5
                               John      M          59          6
                               Jane      F        59.8          7
                               Jeffrey   M        62.5          8
                               Janet     F        62.5          8
                               Carol     F        62.8          9
                               Henry     M        63.5         10
                               Judy      F        64.3         11
                               Robert    M        64.8         12
                               Barbara   F        65.3         13
                               Mary      F        66.5         14
                               William   M        66.8         15
                               Ronald    M          67         16
                               Alfred    M          69         17
                               Philip    M          72         18






二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:数据集 proc sql Distinct Variable SASHELP 如何

已有 2 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
eijuhz + 1 精彩帖子
我的素质低 + 100 + 10 + 5 + 5 + 5 精彩帖子

总评分: 经验 + 100  论坛币 + 10  学术水平 + 5  热心指数 + 6  信用等级 + 5   查看全部评分

420948492 发表于 2016-12-14 09:16:31 |显示全部楼层 |坛友微信交流群
{:3_42:}

使用道具

peking198 发表于 2016-12-18 21:46:42 来自手机 |显示全部楼层 |坛友微信交流群
最后一种方法提示没有按照time排序,最开始是按照sex分组后对time排序的。。。

使用道具

mich_ard 发表于 2016-12-21 02:53:26 |显示全部楼层 |坛友微信交流群
peking198 发表于 2016-12-18 21:46
最后一种方法提示没有按照time排序,最开始是按照sex分组后对time排序的。。。
已改正,谢谢提醒。

使用道具

mich_ard 发表于 2017-1-2 07:06:18 |显示全部楼层 |坛友微信交流群
补充了proc sql 方法。

使用道具

river2537 发表于 2017-8-31 15:30:31 |显示全部楼层 |坛友微信交流群
第一条first 不能处理male或者female组里出现Height相同记录的情况。。。

使用道具

fuyini1130 发表于 2018-7-6 09:39:40 |显示全部楼层 |坛友微信交流群
sql那种方法请问为啥占用那么大空间呢?

使用道具

宜风 发表于 2019-5-9 21:19:08 |显示全部楼层 |坛友微信交流群
同问,sql那个方法为什么运行起来那么慢

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-3-29 21:44