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似乎可以获得该序列。那么,如果输入没有丢失,并且不是您明确列出的两个值中的一个,您希望格式创建什么值?如果在格式定义中没有包含其他选项,那么它只会返回未格式化的值。那会打乱你的分拣顺序。