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

Hello,

 

Is it possible to compute/create a character variable in proc report? What I would like to do is take 2 numbers, a create a new character variable that puts them in a from that looks something like this: (18.2, 21.1). However, it seems that maybe compute blocks can only create numeric variables. Is there a way around this?

 

Thanks!

 

proc surveyfreq data=d1;

tables walk / row cl nowt nostd;

stratum final_stratum;

cluster final_cluster;

weight final_weight;

ods output oneway=out_table;

run;

 

proc report data=out_table;

columns table percent lowerCL UpperCL CL;

define table / display;

define percent / display;

define lowerCL / display;

define UpperCL / display;

define CL / computed ;

compute CL; CL = cats("(", LowerCL, ",", UpperCL, ")"); ENDCOMP;

run;

 

Error message:

 

NOTE: Character values have been converted to numeric values at the places given by:

(Line):(Column).

1:7

NOTE: Invalid numeric data, '(78.900921457,81.793697714)' , at line 1 column 7.

NOTE: Invalid numeric data, '(18.206302286,21.099078543)' , at line 1 column 7.

NOTE: Invalid numeric data, '(_,_)' , at line 1 column 7.

NOTE: There were 3 observations read from the data set WORK.out_table.

NOTE: At least one W.D format was too small for the number to be printed. The decimal may be

shifted by the "BEST" format.

1 ACCEPTED SOLUTION

Accepted Solutions
Cynthia_sas
SAS Super FREQ
Hi,
Yes, you can calculate a character variable in a COMPUTE block, but you have to tell the COMPUTE block that it is character. The default is numeric. So instead of this:
compute CL;
CL = cats("(", LowerCL, ",", UpperCL, ")");
ENDCOMP;

use this:
compute CL / character length=20;
CL = cats("(", LowerCL, ",", UpperCL, ")");
ENDCOMP;

cynthia

View solution in original post

3 REPLIES 3
ballardw
Super User

Since you are not actually calculating the values for the limits in the proc report I would think the easier way would be in an intermediate datastep;

data out_table;
   set out_table;
   CL = cats("(", LowerCL, ",", UpperCL, ")"); 
run;

before the Proc report.

 

I would probably use a Put(lowercl,best6.) or similar in the cats function unless you really think the additional digits are helpful.

 

I know of a method that involves custom format to supply leading (, leading comma with trailing ) , style justifications of right and left for adjacent columns, reducing the cellpadding and border widths to 0 to get that appearance in calculated columns

Cynthia_sas
SAS Super FREQ
Hi,
Yes, you can calculate a character variable in a COMPUTE block, but you have to tell the COMPUTE block that it is character. The default is numeric. So instead of this:
compute CL;
CL = cats("(", LowerCL, ",", UpperCL, ")");
ENDCOMP;

use this:
compute CL / character length=20;
CL = cats("(", LowerCL, ",", UpperCL, ")");
ENDCOMP;

cynthia
Noob
Fluorite | Level 6

Thank you both for your helpful replies!

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!

What is Bayesian Analysis?

Learn the difference between classical and Bayesian statistical approaches and see a few PROC examples to perform Bayesian analysis in this video.

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
  • 3 replies
  • 5913 views
  • 2 likes
  • 3 in conversation