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

I want to use proc print or something to display a table like this below. I have been trying to use arrays, but maybe I'm on the wrong track.

 

 aaabbbcccddd
eee0000
fff0100
ggg0100

 

This is my code so far which doesnt work.

 

data want (keep=C1-C12);
	array fname {4} $ 3 ('aaa', 'bbb', 'ccc', 'ddd');
	array sname {3} $ 3 ('eee', 'fff', 'ggg');
	array C3SP {4,3} $ 1 C1-C12;

do i = 1 to 4;
		do j = 1 to 3;
			if sname[j] in ('fff', 'ggg') and fname[i] = 'bbb' then myname = '1';
			else myname= '0';
			C3SP[i,j] = myname;
			put C3SP[i,j]=;
			output;
		end;
	end;
run;

 

1 ACCEPTED SOLUTION

Accepted Solutions
Astounding
PROC Star

It's not how you approached the problem, but this should get you close:

 

data want;
   do rows = 'eee', 'fff', 'ggg';
      do cols = 'aaa', 'bbb', 'ccc', 'ddd';
         if cols='bbb' and rows in ('fff', 'ggg') then value=1;
         else value=0;
         output;
      end;
   end;
run;
proc tabulate data=want;
   var value;
   class rows cols;
   tables rows, cols*value=' '*sum=' ';
run;

View solution in original post

4 REPLIES 4
Astounding
PROC Star

It's not how you approached the problem, but this should get you close:

 

data want;
   do rows = 'eee', 'fff', 'ggg';
      do cols = 'aaa', 'bbb', 'ccc', 'ddd';
         if cols='bbb' and rows in ('fff', 'ggg') then value=1;
         else value=0;
         output;
      end;
   end;
run;
proc tabulate data=want;
   var value;
   class rows cols;
   tables rows, cols*value=' '*sum=' ';
run;
simmwa
Fluorite | Level 6
Thanks Astounding, but what if I want the 0,1 to be character not numeric? In fact you could change the '0'to '@'
simmwa
Fluorite | Level 6

Not completely sure why, but this mod seems to work. Thanks !!!

Proc Tabulate - Using a character variable in the VAR Statement 

 

 proc format library=work;
invalue mtype
   '@'  = 1
   '&'  = 2
   '%'  = 3
;
value mtype
   1 = '@'
   2 = '&'
   3 = '%'
;
run;

data wantdev3;
   informat myname mtype.;
   format   myname mtype.;
	do rows = 'aaa', 'bbb', 'ccc', 'ddd';
		do cols = 'eee', 'fff', 'ggg';
			if cols in ('fff', 'ggg') and rows = 'bbb' then myname = 1;
			else myname= 2;
			output;
		end;
	end;
run;
proc tabulate data=wantdev3 ;
	var myname;
	class rows cols;
	table rows, cols*myname=' '*sum=' '*f=mtype.; 
run;
andreas_lds
Jade | Level 19

You may have a wrong understanding what arrays are in sas: they exist primary to access variables of same type that need to be processed in the same way. The result you show looks like a report, not like a dataset at all. Another idea: have a look at proc iml, i have hardly used it, but it is the tool in sas to work with matrices.

sas-innovate-2024.png

Available on demand!

Missed SAS Innovate Las Vegas? Watch all the action for free! View the keynotes, general sessions and 22 breakouts on demand.

 

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
  • 4 replies
  • 723 views
  • 1 like
  • 3 in conversation