SAS:如何更改分类变量

时间:2016-12-07 14:16:30

标签: sas levels

为了简单起见,我想说我有一个由四个名字组成的数据集:Anna,Bobby,Casper,Christine。列名称只是“名称”。

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

我可以以某种方式包含以下proc排序语句吗?

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

2 个答案:

答案 0 :(得分:3)

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

例如:

data have;
  length names $15;
  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;

在这里,我创建了一个格式和信息来回传播(名称到数字,数字到名称)。您现在可以按names_cat排序,它将按您的意愿排序。您可以使用cntlin数据集以编程方式(创建格式)执行此操作;搜索此处或您选择的搜索引擎以获取更多相关信息。

要与r进行比较,如果这是你熟悉的,那么数值变量类似于因子变量中的值,格式类似于关卡的标签。 (没有直接模拟元数据中存储的级别,但许多SAS过程可以选择使用格式中存储的数字,与R中使用的级别相同。)

答案 1 :(得分:1)

@Joe的答案是最佳方式,因为它具有可扩展性,并且能够使用CNTLIN从数据集中读取格式。我只是想我会使用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;