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;
为了简单起见,假设我有一个包含四个名字的数据集: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;