BookmarkSubscribeRSS Feed
knveraraju91
Barite | Level 11

Dear,

I trying a code that saves a few data steps . But I am not getting the output I need. Please suggest. Thank you

 

I have to check for           if  cd='p' and valc=t1 and cd='r' and valc=t2 and cd='s' and valc=t3 then "cd=t and valc='y' ;

if  if  cd='p' and valc not in ('t1' '')  and cd='r' and valc not in ('t2' '')and cd='s' and valc not in ('t3' '') then "cd=t and valc='n';

 

date for cd='t' should be populated from where cd='P' 

 

output needed;

id       CD                 valc                   date 

1        p                  t0                   2015-10-10
1         r                  t1                    2015-10-11
1        s                    t2                   2015-10-12

1        t                     y                       2015-10-10             
2      p                    a0                      2015-10-10
2       r                    a1                       2015-10-11
2      s                   a2                         2015-10-12

2       t                     n                      2015-10-10    

data one;
input id cd$ valc $ date $10.;
datalines;
1 p t0 2015-10-10
1 r t1 2015-10-11
1 s t2 2015-10-12
2 p a0 2015-10-10
2 r a1 2015-10-11
2 s a2 2015-10-12
;

proc sort data=one;
by id cd;
run;
data two;
   set one;
  by usubjid;
  array x{99999}$ _temporary_;
  array d{99999}$ _temporary_;
if first.id then do;n=0; d=0;call missing(of x{*});call missing(of d{*});end;
n+1; 
d+1;
x{n}=valc;
d(n)=date;
output;
if last.id then do;
		test='T';
		if x1="t0" and x2 ='t1' and x3 = 't3' then do; valc='Y';
adt=d1;end;
else if cmiss(x1,x2,x3)=0 then do; valc='N'; adt=d1; end;output; end; run;

 

1 REPLY 1
Shmuel
Garnet | Level 18

What do you mean by your line:

 if  cd='p' and valc=t1 and cd='r' and valc=t2 and cd='s' and valc=t3 then "cd=t and valc='y' ;

 

You can't have different values in a variable in the same observation.

You probably mean to check values per ID.

You missed quotes on checking valc values !

 

In such case I would retain flags, one per condition. Turn flags OFF at first.ID.

Turn specific flag according to positive condition .

When last.ID check whether all flags turned on and act according to result.

 

data want;
 set have;
   by ID;
       retain flag1 - flag3 svdt;
       array fl flag1 - flag3;
       if first.ID then do i=1 to 3; fl(i) = 0; end;
       
      if cd='p' and valc = 't1' then do; fl(1) = 1; svdt = date; end;
      if cd='r' and valc = 't2' then fl(2) = 1;
      if cd='s' and valc = 't3' then fl(3) = 1;
      output;   /* save input obs into output */

      if last.ID then do;
         if fl(1) + fl(2) + fl(3) = 3 then do;
            cd = 't' ;
            valc = 'y';
            date = svdt;
           output;   /* write a new obs to output */
         end;
        else do;
            cd = 't' ;
            valc = 'n';
            date = svdt;
            output;   /* write a new obs to output */
         end; 
    end;   /* end if */
run;        

sas-innovate-2024.png

Join us for SAS Innovate April 16-19 at the Aria in Las Vegas. Bring the team and save big with our group pricing for a limited time only.

Pre-conference courses and tutorials are filling up fast and are always a sellout. Register today to reserve your seat.

 

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
  • 1 reply
  • 602 views
  • 1 like
  • 2 in conversation