Hi chouchou,
Others have shown that your INFORMAT is not OK for your purpose. I hope to show you what is happening behind the scenes by examples.
Your value ranges
0 - < 65 , ..... 85 - < 100
produce ERROR. Understanding the reason for this error will get you back to seeking other ways.
First let us stop this ERROR, by a small change in the first and last Range as:
proc format;
invalue $conv
0.001 - < 65 = 'F'
65 -< 75 = 'C'
75 - < 85 = 'B'
85 - 99.999 = 'A'
other = 'Not defined yet ';
run;
I hope this modification may not alter much of your specification. Run this and see that the ERROR is not there. We will see later why this happened.
Next is, how you will read X - as numeric or character from the input file ?
[1] Let X be numeric as in this input file:
data have;
infile cards truncover;
*input x $3.;
input x;
datalines;
1
2
3
50
57
58
68
69
70
71
78
79
80
82
89
90
91
96
99
100
120
;
run;
Now apply the INFORMAT on X as below:
data want;
set have;
x1 = input(x, $conv.);
run;
See the output of the data set, WANT.
proc print data = want;
run;
All your X's are transformed to 'Net defined yet' as only 'other' is applicable for all X's. Why, wait for some time.
[2] Now let X be character Variable.
In the above input file, read X as $3 instead as number and run the following code.
data want;
set have;
x1 = input(x, $conv.);
run;
and see the output of the data set WANT:
proc print data = want;
run;
You will see that the LABELS are OK except for 100 and 120 where you are supposed to get 'Not defined yet'. The following show the reasons.
proc sort data = have out = havesort;
by x;
run;
proc print data = havesort;
run;
When X is a character variable, the sorted file shows the order as 1, 100, 120, 2, 3, 50, ...., 96, 99.
Therefore INFORMAT transforms 1 as F, 100 as F, 120 as F, 2 as F, ..., 58 as F, 68 as C and so on.
The lesson is that SAS treats numeric value ranges as character ranges (by default) like '0' - < '65', ...., '85' - < '100' when INVALUE statement (invalue $convert) is made.
So you can not achieve what you want by your $CONVERT Informat.
Now coming to another way of doing what you want.
Change X to Number in the Input File.
Use the following Format:
proc format;
value numconv
0 - < 65 = 'F'
65 -< 75 = 'C'
75 - < 85 = 'B'
85 - <100 = 'A'
other = 'Not defined yet ';
run;
Now use the following code to transform X.
data want;
set have;
x1 = put(x, numconv.);
run;
proc print data = want;
run;
Message was edited by: MUTHIA KACHIRAYAN