* RAD, 6.14.2001; * http://www.devenezia.com * various ways to compute sequence number within a group; data old; do group = 1 to 10; do detail = 1 to 2 + int (10*ranuni(0)); v = ranuni(0); output; end; end; drop detail; run; %*------------------------------------------; data new1; set old; by group; retain nInGroup 1; * explicit retain; nInGroup = 1 + nInGroup * (1-first.group); * arithmetic equivalent of if/then/else; run; %*------------------------------------------; data new2; * favorite #1; set old; by group; if first.group then nInGroup = 1; else nInGroup + 1; * shorthand for SUM(nGroup,1), anything SUMmed is auto-retained; run; %*------------------------------------------; data new3; set old; by group; if first.group then nInGroup = 0; nInGroup + 1; * no else means extra cpu on first.group; run; %*------------------------------------------; data new4; set old; by group; retain anchor; drop anchor; if first.group then anchor = _N_ - 1; nInGroup = _N_ - anchor; run; %*------------------------------------------; data new5; nInGroup = 0; * override nInGroup being set to missing; do until (last.group); * loop construct popularized by Ian Whitlock; set old; by group; nInGroup = nInGroup + 1; output; end; run; %*------------------------------------------; data new6; nInGroup = 0; * override nInGroup being retained; do until (last.group); set old; by group; nInGroup + 1; output; end; run; %*------------------------------------------; data new7; * favorite #2; do nInGroup = 1 by 1 until (last.group); * loop construct popularized by Paul Dorfman; set old; by group; output; end; run;