可以看出,我按照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
非常感谢您的帮助!
答案 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条件。下一次迭代。
请注意,我们会保留变量x
和count
,以便将x
与下一个ind
进行比较。变量count
等于ind = 1的行中的版本。对于标志指示符,使用CAT
函数将数字变量count
添加到字符串中。
干杯。