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

Hi all.  I'm looking to create a variable that will flag weight-changes between weeks that are greater/ less than 8 pounds.  I think a do loop would be appropriate but I'm not exactly sure how because there are multiple entries per ID number...Here's the layout of my data:

 

ID         Date          Weight

1           6/6                130

1           6/13              135

1           6/21              128

2           6/6                149

2           6/13              151

2           6/21              146

...

Thanks for your help!

 

1 ACCEPTED SOLUTION

Accepted Solutions
PGStats
Opal | Level 21

Assuming that each record represents a week and that data is sorted:

 

data have;
input ID Date $ Weight;
datalines;
1           6/6                130
1           6/13              135
1           6/21              118
2           6/6                149
2           6/13              151
2           6/21              146
;

data want;
do until(last.id);
    set have; by id;
    if not first.id then flag = abs(Weight-lastWeekWeight) > 8;
    output;
    lastWeekWeight = weight;
    end;
drop lastWeekWeight;
run;

proc print; run;
                        Obs    ID    Date    Weight    flag

                         1      1    6/6       130       .
                         2      1    6/13      135       0
                         3      1    6/21      118       1
                         4      2    6/6       149       .
                         5      2    6/13      151       0
                         6      2    6/21      146       0
PG

View solution in original post

3 REPLIES 3
Astounding
PROC Star
The DATA step functions like a DO loop automatically, reading one observation then the next, then the next. Try it this way:

data want;
set have;
by id;
change = dif(weight);
if first.id=0 then do;
if change > 8 then flag ="+";
else if change < -8 then flag ="-";
end;
run;
PGStats
Opal | Level 21

Assuming that each record represents a week and that data is sorted:

 

data have;
input ID Date $ Weight;
datalines;
1           6/6                130
1           6/13              135
1           6/21              118
2           6/6                149
2           6/13              151
2           6/21              146
;

data want;
do until(last.id);
    set have; by id;
    if not first.id then flag = abs(Weight-lastWeekWeight) > 8;
    output;
    lastWeekWeight = weight;
    end;
drop lastWeekWeight;
run;

proc print; run;
                        Obs    ID    Date    Weight    flag

                         1      1    6/6       130       .
                         2      1    6/13      135       0
                         3      1    6/21      118       1
                         4      2    6/6       149       .
                         5      2    6/13      151       0
                         6      2    6/21      146       0
PG
jmmedina25
Obsidian | Level 7

This code worked well; thank you!

hackathon24-white-horiz.png

2025 SAS Hackathon: There is still time!

Good news: We've extended SAS Hackathon registration until Sept. 12, so you still have time to be part of our biggest event yet – our five-year anniversary!

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.

SAS Training: Just a Click Away

 Ready to level-up your skills? Choose your own adventure.

Browse our catalog!

Discussion stats
  • 3 replies
  • 2846 views
  • 2 likes
  • 3 in conversation