Sorting 如何在sas中按定义的顺序排序,而不是按字母顺序排序?

Sorting 如何在sas中按定义的顺序排序,而不是按字母顺序排序?,sorting,sas,Sorting,Sas,假设我有一个超市的数据集,包含产品类别、价格、产品名称等。我想按类别排序,但要按定义的顺序排序,而不是按字母顺序排序 例如,如果类别是:罐装、乳制品、肉类、蔬菜,我想按它们可能过期的时间进行分类(我很可能知道这些信息,所以请继续玩下去)。这意味着我想按以下顺序分类:乳制品、肉类、蔬菜、罐装食品 我用这个签名写了一个宏: key_sort(ds=, keys='canned, dairy, meat, vegetable', field =category, sort_by=) 这将解析键,

假设我有一个超市的数据集,包含产品类别、价格、产品名称等。我想按类别排序,但要按定义的顺序排序,而不是按字母顺序排序

例如,如果类别是:罐装、乳制品、肉类、蔬菜,我想按它们可能过期的时间进行分类(我很可能知道这些信息,所以请继续玩下去)。这意味着我想按以下顺序分类:乳制品、肉类、蔬菜、罐装食品

我用这个签名写了一个宏:

key_sort(ds=, keys='canned, dairy, meat,  vegetable', field =category, sort_by=) 
这将解析键,以便将其放入宏循环中,然后我使用该循环写出select语句,如下所示:

Select(&field. ) ;
    %do i=1 %to &number_of_keys. ;
    %let current_key= %scan(&keys., &I., &delim.) ;
    When(&current_key. ) &field._key=&i. ;
    %end;
End;
然后,我按
字段进行排序。_键


这是最好的方法吗?这能更简洁或有效地完成吗

如果您有一个包含排序的单独数据集,那么您可以利用该数据集并将其作为PROC格式的输入,或者尽可能简单地应用一个只有几位的数据集

proc format; 
    value $EXPIRES 
        'canned'= 4
        'dairy' = 1
        'meat' = 2
        'vegetable' = 3
        other = 5
        ;
run; 

proc sql;
    CREATE TABLE output_set AS 
    SELECT * FROM foods ORDER BY put(produce_type, $expires.); 
quit;

如果您有一个包含排序的单独数据集,那么您可以利用该数据集并将其作为PROC格式的输入,或者尽可能简单地应用一个只有几位的数据集

proc format; 
    value $EXPIRES 
        'canned'= 4
        'dairy' = 1
        'meat' = 2
        'vegetable' = 3
        other = 5
        ;
run; 

proc sql;
    CREATE TABLE output_set AS 
    SELECT * FROM foods ORDER BY put(produce_type, $expires.); 
quit;

这听起来是一个合理的方法。基本上,您需要输入一个数值来定义您感兴趣的类别的相对顺序。然后按该数值排序,而不是按类别排序。我想另一个选项是在上合并该数值。@Pureferret我的SAS有点生锈,我没有安装SAS系统来测试。。。安维。。。proc格式是可以的,但我相信proc sort在排序时没有考虑格式化的值。。。因此,实际上,您可以使用
格式
作为迷你查找时间,并使用sql和临时变量对格式化值进行排序……或者只使用
put(product\u type,$expires.)
在创建数据集的过程中创建订单字段和
proc sort
通常情况下……这听起来是一种合理的方法。基本上,您需要输入一个数值来定义您感兴趣的类别的相对顺序。然后按该数值排序,而不是按类别排序。我想另一个选项是在上合并该数值。@Pureferret我的SAS有点生锈,我没有安装SAS系统来测试。。。安维。。。proc格式是可以的,但我相信proc sort在排序时没有考虑格式化的值。。。因此,实际上,您可以使用
格式
作为迷你查找时间,并使用sql和临时变量对格式化值进行排序……或者只需在数据集的创建过程中使用
put(product\u type,$expires。)
来创建订单字段和
proc sort
。。。