Team,
I have read the codes that have been posted to the community page for retrieving the last observation however I am not receiving the results I need. After inputting all lag statements I need to make sure to keep only the last observation for each patient and I have over 1000 so I would I go about doing this?
Example
name date prescription_1 prescription_2 Prescriber_name
and so on...after I completed my lag statements..
Code
data test;
set sashelp.class end=eof;
if eof then output;
run;
or
data test;
if 0 then set sashelp.class nobs=nobs end=eof;
set sashelp.class point=nobs;
output;
stop;
run;
Please Assist
Sort by patient, and in a data step with
by patient;
use
if last.patient;
One example of getting the "last" of each age group using the sashelp.class data set.
proc sort data=sashelp.class out=work.class; by age ; run; data work.want; set work.class; by age; if last.age; run;
One might guess that for a patient that the data should be sorted by patient identification and a SAS date value (not character or funny number that mimics a date, an actual SAS date value) such as
proc sort data=have by name date; run; data want; set have; by name; if last.name; run;
Character valued dates seldom sort properly and the only date form not a SAS date that works well with this approach has a YYYYMMDD appearance.
Your mention of LAG makes me suspect you may have picked examples from a very complicated approach instead of a basic order of occurrence data example. If you need something other that sorting by personal identification and date then you will likely need to provide some example data and the rules involved.
Thank you for your assistance, I am still stuck. I will share more information, here is my original lag statement
data work.temp2;
set work.sorted;
rx0=extract;
lagnum=lag1(number);
rx1=lag1(rx0);
if lagnum~=number then rx1="";
lagnum=lag2(number);
rx2=lag2(rx0);
if lagnum~=number then rx2="";
lagnum=lag3(number);
rx3=lag3(rx0);
if lagnum~=number then rx3="";
run;.....and it goes on until 25
now I need the last row for each patient that contains their ....
rx_number and number and Patient names and rx_name which one patient can have upto 25 scripts
here is how I am trying to get that last row...
data pharmtest;
set work.temp2;
/***********By is USED FOR THE GROUPING PURPOSE*********/
by NUMBER ;
firstnumber = first.number;
lastnumber = last.number;
if lastnumber=1 then cnt=1;
else cnt+1;
run;
or would I have to do something like this??
data pharmtest;
set work.temp2;
/***********By is USED FOR THE GROUPING PURPOSE*********/
by NUMBER ;
*if last.rx_number and number~=number and PATIENTS=PATIENTS and rx_number~=rx_number and rx_name~=rx_name then do;
lagnum=lag1(number);
rx1=lag1(rx0);
if lagnum~=number then rx1="";
I don't think I would have to lag any more correct?
SAS coding is (as most programming) data-driven. Without knowing what you have, and what you want to get out of it, we can only make (poorly educated) guesses.
Please provide example data in usable form (a data step with datalines), and what you expect to get from it.
SAS Innovate 2025 is scheduled for May 6-9 in Orlando, FL. Sign up to be first to learn about the agenda and registration!
SAS' Charu Shankar shares her PROC SQL expertise by showing you how to master the WHERE clause using real winter weather data.
Find more tutorials on the SAS Users YouTube channel.