SAS - 按排名减少行数

时间:2017-06-22 10:47:35

标签: sas case rank

我目前正在研究SAS中的数据集,如下所示:

people - word - date - rank

A - bla - 01/01/2017 - 1

A - bla - 02/01/2017 - 2

A - 测试 - 03/01/2017 - 3

B - bla - 01/01/2017 - 1

B - 测试 - 09/01/2017 - 2

C - bla - 03/01/2017 - 1

C - 测试 - 05/01/2017 - 2

C - test - 07/01/2017 - 3

C - sas - 08/01/2017 - 4

我想像这样改变它:

people - word - rank

A -------- bla ----- 1

A --------测试----- 2

B -------- bla ----- 1

B --------测试----- 2

C -------- bla ----- 1

C --------测试----- 2

C -------- sas ----- 3

排名取决于日期,按人群分组。

我尝试使用延迟功能,但也使用了情况的语法(它有效但我必须为每个案例执行此操作,并且我的最高等级为94 ......不是很容易!)

所以我找不到最后一张桌子的好方法。

你能帮助我吗?

非常感谢

1 个答案:

答案 0 :(得分:0)

虽然在此网站上发布您尝试过的代码是一个很好的协议,但我认为它不会对此有所帮助,因为lagcase when不是可行的方法。

基本上,您正在尝试删除重复的单词条目并重新定位您的排名列。您可以在单个数据集中实现此功能,利用first.处理,这在使用by语句时可用。

对于排名,最简单的方法是在数据步骤移过记录时从头开始完全重建。

data have;
input people $ word $ date :ddmmyy10. rank;
format date ddmmyy10.;
datalines;
A  bla  01/01/2017  1
A  bla  02/01/2017  2
A  test  03/01/2017  3
B  bla  01/01/2017  1
B  test  09/01/2017  2
C  bla  03/01/2017  1
C  test  05/01/2017  2
C  test  07/01/2017  3
C  sas  08/01/2017  4
;
run;

data want;
set have (drop=rank date); /* remove rank as being rebuilt; date not required */
by people word notsorted; /* enable first. processing; notsorted option required as data not sorted by people and word */
if first.people then rank=0; /* reset rank when people value changes */
if first.word then do;
    rank+1; /* increment rank by 1 for the first word (will ignore subsesquent duplicates) */
    output; /* output row */
end;
run;