BookmarkSubscribeRSS Feed
☑ This topic is solved. Need further help from the community? Please sign in and ask a new question.
Hello_there
Lapis Lazuli | Level 10
data have1;
infile datalines dsd dlm=",";
	input subj $ treatment $ painlvl bodypart $;
datalines;
001, A, 2, leg
002, B, 1, head
003, A, 1, arm
004, B, 1, eye
005, B, 2, mouth
; 
run; * choose distinct subjects with highest severity (if more than one instance);

/* 
2 treatment groups (A or B)
3 levels of pain, 1=low, 2=medium, 3=high
*/

%macro howMany(pain, dsnout);
proc freq data=have1 noprint;
where painlvl=&pain;
	table treatment/ out=count;
run;

data a; set count;
	count_percent=strip(put(count,32.))||" (" || strip(put(percent, 32.2))||")";
run;
proc transpose data=a out=&dsnout (drop= _name_);
	id treatment;
	var count_percent;
run;

data _empty; * if the data set is empty, how do i output this?;
infile datalines dsd dlm=",";
	input a $ b $;
datalines;
0, 0
;
run;


%mend howMANY;

%howMANY(1, _rowa);
%howMANY(2, _rowb);
%howMANY(3, _rowc);

data finished; set _row:;
run;

Hi,

 

Notes:

* n=5

* 2 treatment groups (A or B)

* 3 levels of pain (1=low, 2= medium, 3=high)

* goal: There are no instances of anyone having high pain (painlvl=3). I've created a data set inside the macro that I would like to use that shows 0's for the two variables that will concatenated onto the first two rows that have counts and percents (1=low, 2=medium).

 

I could use proc summary and use the preloadfmt option to include 0's. The issue is that I have to manually merge a denominator for the whole population which the n=5 is just a subset of.

 

I have relatively novice experience w/ SAS. And I was wondering if I could I could do something like an %if, % then do thing in a macro. But I don't have experience w/ that.

 

Thanks

1 ACCEPTED SOLUTION

Accepted Solutions
AMSAS
SAS Super FREQ

Here's one way to work around this

data have1;
infile datalines dsd dlm=",";
	input subj $ treatment $ painlvl bodypart $;
datalines;
001, A, 2, leg
002, B, 1, head
003, A, 1, arm
004, B, 1, eye
005, B, 2, mouth
; 
run; * choose distinct subjects with highest severity (if more than one instance);

/* 
2 treatment groups (A or B)
3 levels of pain, 1=low, 2=medium, 3=high
*/

%macro howMany(pain, dsnout);
proc freq data=have1 noprint;
where painlvl=&pain;
	table treatment/ out=count;
run;

data a; 
	set count ;
	count_percent=strip(put(count,32.))||" (" || strip(put(percent, 32.2))||")";
run;


proc transpose data=a out=&dsnout (drop= _name_);
	id treatment;
	var count_percent;
run;

/* Set macro variable emptyDS to N */
/* Assuming the dataset &dsnout has observations at this point */
%let emptyDS=N ;

/* Datastep checks if &dsnout has observations using the ATTRN function */
/* If it doesn't have observations then flip macro varible emptyDS to Y */
data _null_ ;
	dsid=open("&dsnout") ;
	obsOrVars=attrn(dsid,"ANY") ;
	if obsOrVars ne 1 then
		call symput("emptyDS","Y") ;
	dsid=close(dsid) ;
run ;
	
/* Check value of macro variable emptyDS */
/* If it is Y (an empty dataset) then    */
/* create dataset with observations      */
%if &emptyDS=Y %then %do ;
	data &dsnout ;
		a="0" ;
		b="0" ;
		output ;
	run ;	
%end ;
/*
data _empty; * if the data set is empty, how do i output this?;
infile datalines dsd dlm=",";
	input a $ b $;
datalines;
0, 0
;
run;
*/

%mend howMANY;

%howMANY(1, _rowa);
%howMANY(2, _rowb);
%howMANY(3, _rowc);

data finished; set _row:;
run;

View solution in original post

2 REPLIES 2
AMSAS
SAS Super FREQ

Here's one way to work around this

data have1;
infile datalines dsd dlm=",";
	input subj $ treatment $ painlvl bodypart $;
datalines;
001, A, 2, leg
002, B, 1, head
003, A, 1, arm
004, B, 1, eye
005, B, 2, mouth
; 
run; * choose distinct subjects with highest severity (if more than one instance);

/* 
2 treatment groups (A or B)
3 levels of pain, 1=low, 2=medium, 3=high
*/

%macro howMany(pain, dsnout);
proc freq data=have1 noprint;
where painlvl=&pain;
	table treatment/ out=count;
run;

data a; 
	set count ;
	count_percent=strip(put(count,32.))||" (" || strip(put(percent, 32.2))||")";
run;


proc transpose data=a out=&dsnout (drop= _name_);
	id treatment;
	var count_percent;
run;

/* Set macro variable emptyDS to N */
/* Assuming the dataset &dsnout has observations at this point */
%let emptyDS=N ;

/* Datastep checks if &dsnout has observations using the ATTRN function */
/* If it doesn't have observations then flip macro varible emptyDS to Y */
data _null_ ;
	dsid=open("&dsnout") ;
	obsOrVars=attrn(dsid,"ANY") ;
	if obsOrVars ne 1 then
		call symput("emptyDS","Y") ;
	dsid=close(dsid) ;
run ;
	
/* Check value of macro variable emptyDS */
/* If it is Y (an empty dataset) then    */
/* create dataset with observations      */
%if &emptyDS=Y %then %do ;
	data &dsnout ;
		a="0" ;
		b="0" ;
		output ;
	run ;	
%end ;
/*
data _empty; * if the data set is empty, how do i output this?;
infile datalines dsd dlm=",";
	input a $ b $;
datalines;
0, 0
;
run;
*/

%mend howMANY;

%howMANY(1, _rowa);
%howMANY(2, _rowb);
%howMANY(3, _rowc);

data finished; set _row:;
run;

Hello_there
Lapis Lazuli | Level 10
This was really great. Thanks for your help!

SAS Innovate 2025: Save the Date

 SAS Innovate 2025 is scheduled for May 6-9 in Orlando, FL. Sign up to be first to learn about the agenda and registration!

Save the date!

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
  • 2 replies
  • 470 views
  • 1 like
  • 2 in conversation