SAS:如何更改分类变量的顺序

SAS: how to change the order of a categorical variable

为了简单起见,假设我有一个包含四个名字的数据集:Anna、Bobby、Casper、Christine。列名只是 'Names'.

我想按以下顺序排序:Bobby、Anna、Casper、Christine。我不能在这里使用 'proc sort' 和 'asc/desc'。因为是随机排序,所以需要手动输入顺序。

我能否以某种方式将其包含在以下 proc 排序语句中?

 Proc Sort
  data = dataset; order by Names;
run;

您应该在 SAS 中存储分类变量的方式是作为数字,使用显示字符的格式。这就是其他编程语言的方式,例如R,处理它们(R 中的factor)。

例如:

data have;
  length names ;
  input names $;
  datalines;
Bobby
Anna
Casper
Christine
;;;;
run;

proc format;
  value yourformatf
   1 = 'Bobby'
   2 = 'Anna'
   3 = 'Casper'
   4 = 'Christine'
   other = ' '
   ;
  invalue yourinformati
   'Bobby' = 1
   'Anna' = 2
   'Casper' = 3
   'Christine' = 4
   other = .
   ;

quit;

data want;
  set have;
  names_cat = input(names,yourinformati.);
  format names_cat yourformatf.;
run;

这里我创建了一个格式和一个信息格式去back/forth(名字到数字,数字到名字)。您现在可以按 names_cat 排序,它会根据您的需要进行排序。您可以使用 cntlin 数据集以编程方式(创建格式)执行此操作;在这里搜索或您选择的搜索引擎以获取更多信息。

为了与 r 进行比较,如果您熟悉的话,这里的数值变量类似于因子变量中的值,格式类似于水平标签。 (没有直接模拟存储在元数据中的级别本身,但许多 SAS 过程可以选择使用存储在格式中的数字,就像在 R 中使用级别一样。)

@Joe 的回答是最好的方法,因为它具有可扩展性并且能够使用 CNTLIN 从数据集中读取格式。我只是想 post 一个替代解决方案,使用 proc sql。 SAS 使用的版本使您能够通过添加 order by 语句和 case 语句来动态创建自定义订单。实际上,这会在内存中创建一个额外的列,用于排序,但不会输出该列。

当要排序的项目数量相对较少时,这是一种有用的方法。

proc sql;
create table want 
as select *
from have
order by case names
            when 'Bobby' then 1
            when 'Anna' then 2
            when 'Casper' then 3
            when 'Christine' then 4
        end;
quit;