按顺序对列进行计数和分组

时间:2019-06-03 09:18:58

标签: sas

我有一个数据集,必须按如下所示将其分组。

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

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
相关问题