使用SAS first.变量生成分组计数结果不符合预期求助
问题分析与解决
你的代码逻辑本身是正确的,但出现不符合预期的结果,大概率是因为Actor_Name字段存在隐形字符差异(比如前后空格、大小写不一致),导致第三条Marry Dryn被SAS识别为新的分组,触发first.Actor_Name条件将counter重置为1。
修正方案1:清理字符后再处理
先对Actor_Name做去空格处理,消除隐形差异,再执行排序和分组计数:
DATA a ; INFILE DATALINES DSD DLM='|' ; LENGTH Actor_Name $20 ; INPUT Actor_Name $ Total ; * 去除前后空格; Actor_Name = STRIP(Actor_Name); DATALINES ; Julie Maze | 1 Julie Maze | 1 Julie Maze | 1 Marry Dryn | 1 Marry Dryn | 1 Marry Dryn | 1 ; RUN ; PROC SORT DATA = work.a OUT = a_sorted ; BY Actor_Name ; RUN ; DATA b ; SET work.a_sorted ; BY Actor_Name ; IF first.Actor_Name THEN counter = 1 ; ELSE counter + 1 ; RUN ;
修正方案2:使用PROC SQL窗口函数(更简洁)
无需手动排序,直接用窗口函数实现分组内的序号生成:
DATA a ; INFILE DATALINES DSD DLM='|' ; LENGTH Actor_Name $20 ; INPUT Actor_Name $ Total ; DATALINES ; Julie Maze | 1 Julie Maze | 1 Julie Maze | 1 Marry Dryn | 1 Marry Dryn | 1 Marry Dryn | 1 ; RUN ; PROC SQL ; CREATE TABLE b AS SELECT *, ROW_NUMBER() OVER (PARTITION BY STRIP(Actor_Name) ORDER BY Actor_Name) AS counter FROM a ; QUIT ;
两种方案都能得到你预期的结果:每组counter依次为1,2,3。
内容的提问来源于stack exchange,提问作者Eyal Marom
相关产品推荐
相关产品推荐

