Sas 如何使用';proc格式';格式化丢失的字符串,以便在序列的最后一个位置对其排序?

Sas 如何使用';proc格式';格式化丢失的字符串,以便在序列的最后一个位置对其排序?,sas,Sas,我有一个三类变量:“正”、“负”和“(缺少字符串)。 我想按以下顺序对序列进行排序: "Negative" as 1 "Positive" as 2 ""(missing value)as 3 下面是我使用的代码,如下所示 proc format; value $rank "Negative" = 1 "Positive" = 2 "" = 3; run; proc sql; create table test as select * f

我有一个三类变量:“正”、“负”和“(缺少字符串)。
我想按以下顺序对序列进行排序:

"Negative" as 1
"Positive" as 2
""(missing value)as 3
下面是我使用的代码,如下所示

proc format;
    value $rank
    "Negative" = 1
    "Positive" = 2
    "" = 3;
run;
proc sql;
    create table test as
    select *
    from pre_test
    order by subj, lbdat, put(results, $rank.) 
    ;
quit;
但是proc格式似乎没有将缺失值的顺序设置为3,相反,它也将顺序设置为缺失。

我知道这可以通过使用“if statement”创建新变量来完成

但我真的很想知道,是否有任何选项可以修改proc格式步骤来实现这一目标。


非常感谢您

在SAS中,字符变量缺少的值是单个空格。将格式更改为:

proc format;
    value $rank
    "Negative" = 1
    "Positive" = 2
    " " = 3;
run;
另外,非常重要的是要知道字符格式(以
$
开头)只会映射到另一个字符值。该过程隐式地将您的
=1
=2
=3
更改为实际的
='1'
='2'
='3'

那么,当
格式
步骤有价值时会发生什么

`` = 3
由于格式名称为
$rank
,因此程序假定您将指定:

  • 字符值或范围='格式化值'
双单引号不是解释为空字符串,而是解释为需要隐式单引号的“裸”字符。所以这个过程实际上是在处理一个值映射,相当于:

'''' = '3'
然后,标准的字符串解释将左侧减少为一个引号。这种理解可以通过观察CNTLOUT数据得到证实

proc format;
    value $myformat
    "Negative" = 1
    "Positive" = 2
    ' ' = 3
    ''  = 4 ;

proc format cntlout=formatdata;
proc print     data=formatdata;
  where fmtname='MYFORMAT';
run;
输出

Obs    FMTNAME     START       END         LABEL

 1     MYFORMAT                              3
 2     MYFORMAT    '           '             4          <--- Single quote = 4
 3     MYFORMAT    Negative    Negative      1
 4     MYFORMAT    Positive    Positive      2

Obs FMTNAME开始-结束标签
1我的格式3

2 MyFrase' 4’p>您希望在引号之间包含一个空格,以指定格式的空白值。如果没有空格,它看起来像一个单引号到PROC格式,因为它允许在等号的左侧使用不带引号的值(就像它允许在等号的右侧使用不带引号的字符串一样)。但更重要的是,除了缺少输入之外,您可能还希望为其他意外输入指定一个值

但您可能希望切换到使用informat,以便可以返回数字而不是字符串。这应该更容易作为订单使用。使用informat还可以让它处理混合情况

proc format;
  invalue rank (default=20 upcase)
    "NEGATIVE" = 1
    "POSITIVE" = 2
    " " = 3
    other  = 4
  ;
run;

data test;
  input @1 raw :$20. @1 rank :rank. ;
  rank2=input(raw,rank.);
cards;
Negative
Positive
POSitive
mixed
.
;
结果:

Obs    raw         rank    rank2

 1     Negative      1       1
 2     Positive      2       2
 3     POSitive      2       2
 4     mixed         4       4
 5                   4       3

对于给定的
sub
lbdat
组合,您的数据是否有多个结果?当给定一些其他值(如“Good”)时,您希望格式做什么?您可能只想在格式定义中使用
other
类别,该类别还将捕获所有空白值。@Tom我想使用此格式对最终数据集进行排序,顺序为:“负”、“正”,最后是缺少的值。因为简单地使用order by或proc sort似乎可以获得该序列。那么,如果输入没有丢失,并且不是您明确列出的两个值中的一个,您希望格式创建什么值?如果在格式定义中没有包含其他选项,那么它只会返回未格式化的值。那会打乱你的分拣顺序。