I updated the data as below.
I need to assign baseline values for different groups based on the time points. For example, assign the value of the last record (value at Day 5) in the S1 group to the baseline value for the next group S2 except for baseline of S1 group which is assigned using the result at Day 1. There are about 30 subjects with 6 records (Day 1 to Day 9). Day 1 and Day 5 are for S1, Day 6 and Day 7 are for S2, and Day 8 and Day 9 for S3.
Any input/suggestions will be appreciated.
The current data looks like this:
DATA dt;
INPUT ID $ grp $ DAY result ;
CARDS;
001 s1 1 4.1
001 s1 5 5.0
001 s2 6 3.5
001 s2 7 6.2
001 s3 8 2.5
001 s3 9 1.9
002 s1 1 4.3
002 s1 5 5.1
002 s2 6 3.5
002 s2 7 3.9
002 s3 8 2.5
002 s3 9 1.9
;
RUN;
new data should include baseline value like this-
use the last obs of the group as the baseline value for the next group.
DATA newdt;
INPUT ID $ grp $ DAY result baseline ;
CARDS;
001 s1 1 4.1 4.1
001 s1 5 5.0 4.1
001 s2 6 3.5 5.0
001 s2 7 6.2 5.0
001 s3 8 2.5 6.2
001 s3 9 1.9 6.2
002 s1 1 4.3 4.3
002 s1 5 5.1 4.3
002 s2 6 3.5 5.1
002 s2 7 3.9 5.1
002 s3 8 2.5 3.9
002 s3 9 1.9 3.9
;
RUN;
@jojo wrote:
Thanks very much for the reply. I have updated the post with the data/data step code.
You description still doesn't mention any exception for use of the changing ID value...
This seems to work for the given example:
data newdt; set dt; by id grp; retain baseline; if first.id then baseline=result; output; if last.grp then baseline=result; run;
The BY variables create automatic 1/0 (true/false) variables that indicate whether the current observation is the first or last of the By value. These are accessed using the First.<variablename> and Last.<variablename> syntax. The values are not added to the data set unless you assign them to a variable.
Retain tells SAS to keep the values of the variable(s) across the data step boundary.
Your request involves timing of setting the value vs when the data is written to the output data. So write the data and then reset the new baseline when needed.
The First.ID sets the baseline when a new Id is encountered with the first result value.
Details please. You say "use day 5 value as baseline value for group 1 and day 8 value as baseline value for group2". What in the data set tells us that those are the days to use? Otherwise all we can do is provide a baseline for group 1 and 2. If you have groups 3, 4, 5 or more there is nothing to tell us which value(s) to use.
Also you should provide your example data in the form of data step code so we don't have to guess as to variable types.
@jojo wrote:
need to assign baseline values for different groups based on the time points. Any input/suggestions will be appreciated.
The current data looks like this:
id day value group
1 1 4 .
1 5 3 .
1 6 6 1
1 7 5 1
1 8 3 1
1 9 1 2
1 10 2 2
2 1 3 .
2 5 4 .
2 6 3 1
2 7 6 1
2 8 3 1
2 9 3 2
2 10 6 2
new data should look like this: use day 5 value as baseline value for group 1 and day 8 value as baseline value for group2
id day value group baseline
1 1 4 . .
1 5 3 . 3
1 6 6 1 3
1 7 5 1 3
1 8 4 1 3
1 9 1 2 4
1 10 2 2 4
2 1 3 . .
2 5 4 . .
2 6 3 1 4
2 7 6 1 4
2 8 3 1 4
2 9 3 2 3
2 10 6 2 3
@jojo wrote:
Thanks very much for the reply. I have updated the post with the data/data step code.
You description still doesn't mention any exception for use of the changing ID value...
This seems to work for the given example:
data newdt; set dt; by id grp; retain baseline; if first.id then baseline=result; output; if last.grp then baseline=result; run;
The BY variables create automatic 1/0 (true/false) variables that indicate whether the current observation is the first or last of the By value. These are accessed using the First.<variablename> and Last.<variablename> syntax. The values are not added to the data set unless you assign them to a variable.
Retain tells SAS to keep the values of the variable(s) across the data step boundary.
Your request involves timing of setting the value vs when the data is written to the output data. So write the data and then reset the new baseline when needed.
The First.ID sets the baseline when a new Id is encountered with the first result value.
Thanks very much. It works for my data.
I updated the data below. The order of grp is not the same as the order of DAY, and I need to assign the baseline value based on the order of day. I tried to add DAY in by statement, but it doesn't work.
DATA dt;
INPUT ID $ grp $ DAY result ;
CARDS;
001 s2 1 4.1
001 s2 5 5.0
001 s1 6 3.5
001 s1 7 6.2
001 s3 8 2.5
001 s3 9 1.9
002 s2 1 4.3
002 s2 5 5.1
002 s1 6 3.5
002 s1 7 3.9
002 s3 8 2.5
002 s3 9 1.9
;
RUN;
Are you ready for the spotlight? We're accepting content ideas for SAS Innovate 2025 to be held May 6-9 in Orlando, FL. The call is open until September 25. Read more here about why you should contribute and what is in it for you!
Need to connect to databases in SAS Viya? SAS’ David Ghan shows you two methods – via SAS/ACCESS LIBNAME and SAS Data Connector SASLIBS – in this video.
Find more tutorials on the SAS Users YouTube channel.