可以看到,我按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
非常感激你的帮助!
由于数据集已排序,因此我们将使用您的排序集进行“转发”(我认为这很容易)。我们将使用该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
到字符串中。
干杯。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句