为了简单起见,我想说我有一个由四个名字组成的数据集:Anna,Bobby,Casper,Christine。列名称只是“名称”。
我想按顺序排序:Bobby,Anna,Casper,Christine。我不能在这里使用'proc sort'和'asc / desc'。因为它是随机订购的,我需要手动输入订单。
我可以以某种方式包含以下proc排序语句吗?
Proc Sort
data = dataset; order by Names;
run;
答案 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;