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!
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
  • 856 views
  • 1 like
  • 2 in conversation