根据指标保存状态,可能使用Retain语句

时间:2013-12-14 07:44:45

标签: sas

可以看出,我按照rk和降序版本对数据进行了排序:

data have;
rk = 1;
version = 7;
ind = 0;
output;
rk = 1;
version = 6;
ind = 1;
output;
rk = 1;
version = 5;
ind  = 0;
output;
rk = 1;
version = 4;
ind = 0;
output;
rk = 1;
version = 3;
ind = 1;
output;
rk = 1;
version = 2;
ind = 0;
output;
rk = 1;
version = 1;
ind = 0;
output;
rk = 1;
version = 0;
ind = 0;
output;
run;

我想到了保留声明。但是这个问题的任何解决方案都适合我。 我需要做的是, 如果在某个时刻,ind = 1,我想要同一个rk的所有先前行(版本),以获得某种指示。

基本上, 版本0,1,2应该被标记,因为版本3有ind = 1;

应该标记

版本4,5,因为版本6具有ind = 1;

但版本7根本不应受到影响,因为它出现在ind = 1行之后, 而不是在他们面前。

如果每个标记的行受到ind = 1的行的影响,那就更好了 将有一个指示器指出受此更改影响的版本号, 含义 版本0,1,2将有一个名为“affected_by”的字段等于3 版本4,5将使该字段等于6

非常感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

由于数据集已经排序,我们将使用您的排序集“前进”(我认为更容易)。我们将使用SELECT语句,因为我们只希望每次迭代执行一次。我们还将使用您建议的RETAIN语句和CAT函数将字符串连接在一起以生成指标flag

data test;
    set have;
    drop N count x;

    select;
        when(ind = 1) do;
            N = 1;
            count = version;
            retain N count;
            output;
        end;

        when(N = 1) do;

            x = ind;
            flag = cat('Flagged because of version ', count);
            N = .;
            retain x count;
            output;
        end; 

        when(x = ind) do;
            flag = cat('Flagged because of version ', count);
            retain x count;
            output;
        end;
        otherwise do;
            output;
        end;
    end;

run;

输出:

                   rk    version    ind                flag

                    1       7        0
                    1       6        1
                    1       5        0     Flagged because of version 6
                    1       4        0     Flagged because of version 6
                    1       3        1
                    1       2        0     Flagged because of version 3
                    1       1        0     Flagged because of version 3
                    1       0        0     Flagged because of version 3

在这种情况下,N用作前一个观察值为ind = 1的指标。然后我们将其销毁(即N =。),否则它将再次满足N = 1条件。下一次迭代。

请注意,我们会保留变量xcount,以便将x与下一个ind进行比较。变量count等于ind = 1的行中的版本。对于标志指示符,使用CAT函数将数字变量count添加到字符串中。

干杯。