在SAS中,如何使用以下特征在一个组中进行循环

时间:2017-07-30 02:50:44

标签: loops sas

我有以下问题:

data example;
input channel $ program $ item1 item2 GOAL1 GOAL2;
datalines;
CS A 100 10 100 10
CS A 101 9 100 9
CS B 102 11 102 11
CS B 101 14 101 11
BD A 200 210 200 210
BD A 201 209 200 209
BD B 202 211 202 211
BD B 201 214 201 214
;
run;

首先,我需要注意,将在通道程序级别执行操作。 第二,第三个变量调用THIRD在第一个条目中按类别等于item1。但是,在第三个第三个条目中,它会有所不同:if item1_entry1

data poli;
set poli;
by channel program;
array prog{*} A B; /*IN my original data I have 3 programs, so the solution has to be general*/
third=item1; /*So the first entry of item1 will be equal in third*/
do k=1 to dim(prog);
if program=prog{k} then do;
if lag(item1)<lag(item1) then THIRD=lag(item1)
else THIRD=item1;
end;
end;
run;

正如预期的那样,代码并没有给我我想要的东西。 具体而言,第三和第四应该等于变量GOAL1和GOAL 2.

注意:比较背后的想法是,总是较高的水平将大于或等于较低的水平,较低的水平不能大于较高的水平:我不能有100然后101,一组应该是100和100。

1 个答案:

答案 0 :(得分:0)

您的描述有点不清楚。我想你想要计算一个新变量want1,它在每个group by的开头设置为item1的值。如果item1减少,则在by group中减少,否则保持不变。我会尝试(未经测试):

data want;
   set example;
   by channel program;
   retain want1;
   if first.program then want1=item1;
   else want1=min(want1,item1);
run;