BookmarkSubscribeRSS Feed
Sheeba
Lapis Lazuli | Level 10

have a question related to the following code.

 

 

Temp1, Temp2, Temp3, Temp4 are variables from dataset temp.

Ds1, ds2, ds3, ds4 are variables from the dataset2.

Code is the variable from temp and code has been renamed to _code1 in dataset2.

 

For a particular records in temp the value of mid=1 and pid =6. It has a single match in dataset 2.

 

 

 

 

data Temp;

input Code $ mid pid temp1 $ temp2 $ temp3 $ temp4 $;

datalines;

AB 1 6 aaa bbb xxx yyy

;

run;

 

 

data Dataset2;

input Code $ ds1 $ ds2 $ ds3 $ ds4 $;

datalines;

AB aaa bbb xxx yyy

;

run;

 

 

 

 

data two;

    set temp;

 

    * Drop temporary variables;

    DO i=1 TO xnobs;

        SET dataset2 (rename=(code=_code1)) NOBS=xnobs POINT=i;

 

        if code=_code1 then

            do;

                if mid=1 then

                    do;

                        if temp1=ds1 and temp2 = ds2 then

                            do;

                                m_match='Y';

                                output;

                            end;

                    end;

               if pid =6 then

                        if  temp3 = ds3 and temp4=ds4 then

                            do;

                             p_match='Y';

                                output;

                            end;

                            end;

            end;

 

run;

 

The problem is when I run the below query the output has 2 rows where as I need one row in the output which has both m_match=’Y’ and p_match =’Y’.

 

Also if by any chance if the output has only one row with either p_match='Y' or m_match='Y', i need to retrieve that as well

 

It will be great if you can help me with this.

 

Editing the message to add few more details

Please find the output below

 

Code

mid

pid

temp1

temp2

temp3

temp4

uni_seq_num

_code1

ds1

ds2

ds3

ds4

m_match

p_match

AB

1

6

aaa

bbb

xxx

yyy

36111

AB

aaa

bbb

xxx

yyy

Y

 

AB

1

6

aaa

bbb

xxx

yyy

36111

AB

aaa

bbb

xxx

yyy

Y

Y

 

 

One thing which i noticed is even though the conditions are matching (temp3=ds3 and temp4=ds4) p_match= set to blank. I am lil confused on this.

Thanks in advance,

Regards,

Sheeba Swaminathan

 

5 REPLIES 5
RW9
Diamond | Level 26 RW9
Diamond | Level 26

I am really not sure here what you ar trying to do.  From what I can work out of your post, then this:

data two;
  merge temp dataset2;
  by code;
  m_match=ifc(temp1=ds1 and temp2=ds2,"Y","");
  p_match=ifc(temp3=ds3 and temp4=ds4,"Y","");
run;

Should be all you need.  If there is multiple rows, then retain m_match and p_match and if last.code then output?  Maybe clearly explain what you mean, update test data to reflect the scenarios, and provide what the output from that data should be.  It maybe you can simply use exists() function in SQL.

Sheeba
Lapis Lazuli | Level 10

Hi RW9,

 

Thanks a lot for the solution.

 

The problem is that the join is many to many and hence match merge is not giving exact results. I will try to add the data to reflect actual scenarios.

 

 

Regards,

Sheeba

Tom
Super User Tom
Super User

Only execute the OUTPUT statement once if you only want to write one record.  So your program flow should be.

Calculate FLAG1 ;
Calculate FLAG2 ;
IF FLAG1 and FLAG2 then output;

In general I find it much easier to code if I use boolean values instead of characters strings.  For this type of problem initialize the flags to false and then set true when your condition is matched.

m_match=0;
p_match=0;
if code=_code1 then do;
  if mid=1 and temp1=ds1 and temp2=ds2 then m_match=1;
  if pid =6 and temp3=ds3 and temp4=ds4 then p_match=1;
end;
if m_match and p_match then output;

Also it really seems your program is way too complicated.  If you want to merge on the value of CODE then just use the MERGE statement.

data want ;
  merge temp dataset2 ;
  by code ;
  if  (mid=1 and temp1=ds1 and temp2=ds2)
  and (pid=6 and temp3=ds3 and temp4=ds4)
  ;
run;
Sheeba
Lapis Lazuli | Level 10

Hi Tom,

 

thanks a lot for the reply.

 

I will modify the flags.

 

The problem here is join is many to many and match merge doesnt' have expected results.

 

Regards,

Sheeba

Astounding
PROC Star

And if no rows match on both, but you have one row with m_match='Y' and a different row with p_match='Y', do you want to output both of them?

 

Any of this can be done with a program that builds on the RW9 solution:

 

data want;

m_match=' ';

p_match=' ';

do until (last.code);

   merge temp dataset2;

   by code;

   m_match=;

   p_match=;

   * Track the combinations found;

end;

* Check the combinations found and decide which combinations should be output;

do until (last.code);

   merge temp dataset2;

   by code;

   m_match=

   p_match=

   if /* right combination is found */ then output;

end;

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
  • 5 replies
  • 1934 views
  • 3 likes
  • 4 in conversation