Когда на графике Proc FREQ
отображаются значения табличных переменных в алфавитном порядке, а параметр графика order=
не указан, у вас есть следующий сценарий
- переменная является символом
- порядок отображения по умолчанию (
INTERNAL
)
Примечание: другие методы построения частот, такие как SGPLOT
VBAR
, распознают спецификацию оси средней точки, которая может управлять явным порядком появления значений символов. Proc FREQ
не имеет опции заговора для mxaxis.
Вы правы, полагая, что обратная карта (или переназначение, или отображение) от метки до желаемого упорядоченного значения является существенной. Есть два основных способа переназначить
- пользовательский формат для сопоставления метки с символьным значением (через
PUT
)
- пользовательская информация для отображения метки на числовое значение (через
INPUT
)
После того, как вы переопределили метки к значению, вам нужен второй пользовательский формат для сопоставления значений с исходными метками.
Пример: * * тысяча тридцать-один
* format to map unmapped labels back to original labels;
proc format;
value category
1 = 'Less than 5 weeks'
2 = '5 to 10 weeks'
3 = '10 to 15 weeks'
4 = '15 to 20 weeks'
5 = '20 to 25 weeks'
6 = 'Greater than 25 weeks'
;
* informat to unmap labels to numeric with desired freq plot order;
invalue category_to_num
'Less than 5 weeks' = 1
'5 to 10 weeks' = 2
'10 to 15 weeks' = 3
'15 to 20 weeks' = 4
'20 to 25 weeks' = 5
'Greater than 25 weeks' = 6
;
* generate sample data;
data have;
do itemid = 1 to 500;
cat_num = rantbl(123,0.05,0.35,0.25,0.15,0.07); * for demonstration purposes;
cat_char = put(cat_num, category.); * your actual category values;
output;
end;
run;
* demonstration: numeric category (unformatted) goes ascending internal order;
proc freq data=have;
table cat_num / plots=freqplot(scale=percent) ;
run;
* demonstration: numeric category (formatted) in desired order with desired category text;
proc freq data=have;
table cat_num / plots=freqplot(scale=percent) ;
format cat_num category.;
run;
* your original plot showing character values being ordered alphabetically
* (as is expected from default order=internal);
proc freq data=have;
table cat_char / plots=freqplot(scale=percent) ;
run;
* unmap the category texts to numeric values that are ordered as desired;
data have_remap;
set have;
cat_numX = input(cat_char, category_to_num.);
run;
* table the numeric values computed during unmap, using format to display
* the desired category texts;
proc freq data=have_remap;
table cat_numX / plots=freqplot(scale=percent) ; * <-- cat_numX ;
format cat_numX category.; * <-- format ;
run;