简体   繁体   中英

Cummulative sum of variable by a condition and ID on sas

I am trying to sum one variable as long as another remains constant. I want to cumulative sum dur as long as a is constant. when a changes the sum restarts. when a new id, the sum restarts.

enter image description here

and I would like to do this: enter image description here

Thanks

You can use a BY statement to specify the variables whose different value combinations organize data rows into groups. You are resetting an accumulated value at the start of each group and adding to the accumulator at each row in the group. Use retain to maintain a new variables value between the DATA step implicit loop iterations. The SUM statement is a unique SAS feature for accumulating and retaining.

Example:

data want;
  set have;
  by id a;
  if first.a then mysum = 0;
  mysum + dur;
run;

The SUM statement is different than the SUM function.

<variable> + <expression>;  * SUM statement, unique to SAS (not found in other languages);

can be thought of as

retain <variable>;
<variable> = sum (<variable>, <expression>);

As far as I am concerned, you need to self-join your table with a ranked column.

It should be ranked by id and a columns.

FROM WORK.QUERY_FOR_STCKOVRFLW t1; is the table you provided in the screenshot

PROC SQL;
   CREATE TABLE WORK.QUERY_FOR_STCKOVRFLW_0001 AS 
   SELECT t1.id, 
          t1.a, 
          t1.dur, 
          /* mono */
            (monotonic()) AS mono
      FROM WORK.QUERY_FOR_STCKOVRFLW t1;
QUIT;

PROC SORT
    DATA=WORK.QUERY_FOR_STCKOVRFLW_0001
    OUT=WORK.SORTTempTableSorted
    ;
    BY id a;
RUN;
PROC RANK DATA = WORK.SORTTempTableSorted
    TIES=MEAN
    OUT=WORK.RANKRanked(LABEL="Rank Analysis for WORK.QUERY_FOR_STCKOVRFLW_0001");
    BY id a;
    VAR mono;
RANKS rank_mono ;
RUN; QUIT;



PROC SQL;
   CREATE TABLE WORK.QUERY_FOR_RANKRANKED AS 
   SELECT t1.id, 
          t1.a, 
          t1.dur, 
          /* SUM_of_dur */
            (SUM(t2.dur)) FORMAT=BEST12. AS SUM_of_dur
      FROM WORK.RANKRANKED t1
           LEFT JOIN WORK.RANKRANKED t2 ON (t1.id = t2.id) AND (t1.a = t2.a AND (t1.rank_mono  >=  t2.rank_mono ))
      GROUP BY t1.id,
               t1.a,
               t1.dur;
QUIT;

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM