我有一个数据集,必须按如下所示将其分组。
ID dept count
1 10 2
2 10 2
3 20 4
4 20 4
5 20 4
6 20 4
7 30 4
8 30 4
9 30 4
10 30 4
因此,对于每第3行,我需要一个新级别,输出应如下所示。
ID dept count Level
1 10 2 1
2 10 2 1
3 20 4 1
4 20 4 1
5 20 4 2
6 20 4 2
7 30 4 1
8 30 4 1
9 30 4 2
10 30 4 2
我曾尝试根据部门和计数来计算行数。
data want;
set have;
by dept count;
if first.count then level=1;
else level+1;
run;
这会产生一个计数,但不是我真正想要的
ID dept count Level
1 10 2 1
2 10 2 1
3 20 4 1
4 20 4 1
5 20 4 2
6 20 4 2
7 30 4 1
8 30 4 1
9 30 4 2
10 30 4 2
答案 0 :(得分:0)
不清楚您想要什么输出。我已经扩展了您的输入数据-请 您能否澄清此输入的期望输出以及生成该输入的逻辑是什么?
我已经大致猜测出您的目标是-以相同的dept和count每3行增加一次-也许这足以让您获得所需的答案?
data have;
input ID dept count;
cards;
1 10 2
2 10 2
3 20 4
4 20 4
5 20 4
6 20 4
7 30 4
8 30 4
9 30 4
10 30 4
11 30 4
12 30 4
13 30 4
14 30 4
;
run;
data want;
set have;
by dept count;
if first.count then do;
level = 0;
dummy = 0;
end;
if mod(dummy,3) = 0 then level + 1;
dummy + 1;
drop dummy;
run;
输出:
ID dept count level
1 10 2 1
2 10 2 1
3 20 4 1
4 20 4 1
5 20 4 1
6 20 4 2
7 30 4 1
8 30 4 1
9 30 4 1
10 30 4 2
11 30 4 2
12 30 4 2
13 30 4 3
14 30 4 3
答案 1 :(得分:0)
执行此操作的一种方法是将SET语句嵌套在DO循环中。或者在这种情况下,有两个DO循环。一种生成LEVEL(在DEPT内),第二种生成2。使用LAST.DEPT标志来处理奇数个观测值。
因此,如果我修改输入以在某些组中包含奇数个观测值。
data have;
input ID dept count;
cards;
1 10 2
2 10 2
3 20 4
4 20 4
5 20 4
6 20 4
7 20 4
8 30 4
9 30 4
10 30 4
;
然后可以使用此步骤来分配LEVEL变量。
data want ;
do level=1 by 1 until(last.dept);
do sublevel=1 to 2 until(last.dept);
set have;
by dept;
output;
end;
end;
run;
结果:
Obs level sublevel ID dept count
1 1 1 1 10 2
2 1 2 2 10 2
3 1 1 3 20 4
4 1 2 4 20 4
5 2 1 5 20 4
6 2 2 6 20 4
7 3 1 7 20 4
8 1 1 8 30 4
9 1 2 9 30 4
10 2 1 10 30 4