gpt4 book ai didi

sas - 检查数字、时间等的正确排序

转载 作者:行者123 更新时间:2023-12-04 15:47:50 25 4
gpt4 key购买 nike

我的数据看起来像这样:

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 ;

关于sas - 检查数字、时间等的正确排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21024098/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com