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