BookmarkSubscribeRSS Feed
🔒 This topic is solved and locked. Need further help from the community? Please sign in and ask a new question.
braverju
Obsidian | Level 7

Dear Community, 

 

I have the following dataset, that describes N persons who have up to 3 visits and took 3 measures (vars) at each visit. 

 

Person     Visit   Var1 Var2 Var3   

1               1      10    30     1    

1               2       5     20     3 

2               1       7     15     5     

2               2       5      13    5    

3               3       5      13     5       

3               1       6      12    4         

3               2       1      10    7     

3               3       2       8    6      

 

I would like to calculate a difference from the first visit for each Var. The resulting dataset should look like this: 

 

Person     Visit   Var1 Var2 Var3    Diff_1     Diff2    Diff3

1               1      10    30     1          .            .           .

1               2       5     20     3 ..        -5          -10       2

2               1       7     15     5          .           .           . 

2               2       5      13    5          -2         -17       0

3               3       5      13     5         .             .          .

3               1       6      12    4         1            -1         -1

3               2       1      10    7         -4          -3          2

3               3       2       8    6          -3          -5          1

 

I created the following code: 

-----------------------------------------------------------------

PROC SORT DATA = have;
      by Person VISIT;
RUN;

 

DATA want;
    SET have;
    by Person VISIT;
    RETAIN BL; //Baseline value = value for the first visit

ARRAY ITEM{3} VAR1 - VAR3;
ARRAY ITEM_sinceBL{3} Var1_sinceBL Var2_sinceBL Var3_sinceBL;


DO I=1 TO 3;
    if first.Person THEN BL = ITEM(I);
    ELSE ITEM_sinceBL(I) = ITEM(I) - BL;
END;


drop BL;
RUN;

––––––––––––––––––––––––––––––––––––––––––

 

(I use look because in reality I have 18 variables.) But I don't get the right result. My BL seems to have the wrong value. 

 

I would appreciate your help very much

 

Julia

1 ACCEPTED SOLUTION

Accepted Solutions
RW9
Diamond | Level 26 RW9
Diamond | Level 26

DONT CODE ALL IN UPPERCASE!

It hurts the eyes.

 

So what you want to do is:

get baseline record, merge this onto your data, then calculate.

data want;
  merge have 
        have (where=(visit=1) rename=var1-var_old1 var2=var_old2 var3=var_old3);
by person; array var{3}; array var_old{3}; array diff_{3} 8.; do i=1 to 3; diff_{i}=var{i} - var_old{i}; end; run;

Not tested, post test data in the form of a datastep so we have something to work with.

View solution in original post

3 REPLIES 3
gamotte
Rhodochrosite | Level 12
Hello,

When you're on the baseline row, you set the BL variable three times so that, on the following rows you're only left with the last computed BL value, BL=ITEM(3).
You have to store baseline values in an array.
RW9
Diamond | Level 26 RW9
Diamond | Level 26

DONT CODE ALL IN UPPERCASE!

It hurts the eyes.

 

So what you want to do is:

get baseline record, merge this onto your data, then calculate.

data want;
  merge have 
        have (where=(visit=1) rename=var1-var_old1 var2=var_old2 var3=var_old3);
by person; array var{3}; array var_old{3}; array diff_{3} 8.; do i=1 to 3; diff_{i}=var{i} - var_old{i}; end; run;

Not tested, post test data in the form of a datastep so we have something to work with.

braverju
Obsidian | Level 7
Thank you very much! It worked for me.

sas-innovate-2024.png

Don't miss out on SAS Innovate - Register now for the FREE Livestream!

Can't make it to Vegas? No problem! Watch our general sessions LIVE or on-demand starting April 17th. Hear from SAS execs, best-selling author Adam Grant, Hot Ones host Sean Evans, top tech journalist Kara Swisher, AI expert Cassie Kozyrkov, and the mind-blowing dance crew iLuminate! Plus, get access to over 20 breakout sessions.

 

Register now!

How to Concatenate Values

Learn how use the CAT functions in SAS to join values from multiple variables into a single value.

Find more tutorials on the SAS Users YouTube channel.

Click image to register for webinarClick image to register for webinar

Classroom Training Available!

Select SAS Training centers are offering in-person courses. View upcoming courses for:

View all other training opportunities.

Discussion stats
  • 3 replies
  • 2153 views
  • 1 like
  • 3 in conversation