检查数字、时间等的正确顺序

  • 本文关键字:顺序 时间等 数字 sas
  • 更新时间 :
  • 英文 :


我的数据看起来像这样:

data tmp ;
input id var1 - var5 ;
datalines ;
1 1 2 3 4 5
2 1 2 . . .
3 1 . . . 4
4 . 3 . . . 
5 . . . . 5
6 1 3 2 2 3
7 5 3 7 8 9
8 1 . . . 2
9 1 . 2 3 4
;
run ;

我试图确定 n 个变量是否正确"有序"。我所说的顺序是指时间上的数字或顺序(甚至字母顺序)。所以在这个例子中,我想要的输出是:

dummy = 1 1 1 1 1 0 0 1 1因为 dummy = 1 的顺序正确。

如果我有完整的数据,那将是微不足道的:

if var1 <= var2 <= ... <= varn then dummy = 1; else dummy = 0;

不幸的是,我没有完整的数据。所以问题可能是 sas 将.视为一个非常小的数字(?),而且我无法对.执行操作,因为这也失败了:

if 0 * (var1 = .) + var1 <= 
var1 * (var2 = .) + var2 <= 
var2 * (var3 = .) + var3 <= ... <= 
var_n-1 * (varn = .) + varn 
then dummy = 1; 
else dummy = 0;

基本上,这将检查变量是否.,如果是,则使用不等式中的先前值,但如果它没有丢失,则照常进行。这有时有效,但仍需要大部分信息不丢失。

我也尝试过类似的东西:

if var2 = max(var1, var2) & var1 <= var2 & 
var3 = max(var1 -- var3) & var2 <= var3 & ...

但这种方法也需要完整的数据。并且我尝试将数据转置为长格式,以便我可以删除丢失的列(并且只保留我有兴趣了解顺序的变量),但是转置的数千个变量的数据集对我没有用(如果您转换回宽,仍然会缺少列)。

显然,我不是最好的 SASer,但理想情况下,我想写一个宏或其他东西,因为这个问题经常出现在我身上(基本上只是一个数据检查,看看日期是否有序,并且在它们应该发生在它们应该关于他们的相对时间线的时候)。

这是所有代码:

data tmp ;
input id var1 - var5 ;
datalines ;
1 1 2 3 4 5 
2 1 2 . . .
3 1 . . . 4
4 . 3 . . .
5 . . . . 5
6 1 3 2 2 3
7 5 3 7 8 9
8 1 . . . 2
9 1 . 2 3 4
;
run ;
data tmp1 ; 
set tmp ;
if var1 <= var2 <= var3 <= var4 <= var5 then dummy1 = 1 ; else dummy1 = 0 ;
if 0 * (var1 = .) + var1 <=
var1 * (var2 = .) + var2 <= 
var2 * (var3 = .) + var3 <=
var3 * (var4 = .) + var4 <=
var4 * (var5 = .) + var5
then dummy2 = 1 ;
else dummy2 = 0 ;
if var2 = max(var1,var2) & var1 ~= var2 &
var3 = max(var1, var2, var3) & var2 ~= var3 &
var4 = max(var1, var2, var3, var4) & var3 ~= var4 &
var5 = max(var1, var2, var3, var4, var5) & var4 ~= var5
then dummy3 = 1 ; 
else dummy3 = 0 ;
* none of dummy1 - 3 pick up the observations that are in proper order ;
run ;

data tmp1_varsIwant ;
set tmp1 ;
keep id var1 -- var5 ;
run ;
proc transpose data = tmp1_varsIwant out = tmp1_long ;
by id ;
run ;
data tmp1_long ;
set tmp1_long ;
if col1 = . then delete ;
if _name_ in('var6', 'var999') then delete ;
run ;
proc sort data = tmp1_long ;
by id col1 ;
run ;

也许您可以将所有逻辑强制到一个条件中,但使用这样的循环可能更简单:

data tmp1 ; 
set tmp ;
array vars (*) var1-var5;
last_highest = .;
dummy = 1;
do i = 1 to 5;
if vars(i) > . and vars(i) < last_highest then do;
dummy = 0;
leave;
end;
last_highest = coalesce(vars(i),last_highest);
end;
run ;

最新更新