同时创建两个索引

Create two indexes at same time

是否可以在 SAS 数据步骤上同时创建多个索引?

我有关注

DATA DADOS;
    INFILE DATALINES DELIMITER=',';
    INPUT SETOR $ DIRETORIA $ 13.;
    DATALINES;
    SETOR1,DIRETORIA1
    SETOR1,DIRETORIA2
    SETOR2,DIRETORIA1
    SETOR2,DIRETORIA2
    SETOR2,DIRETORIA4
    SETOR3,DIRETORIA4
    SETOR4,DIRETORIA2
    SETOR5,DIRETORIA2
    SETOR5,DIRETORIA3
;RUN;

然后我需要添加两个索引,一个用于 SETOR 列,另一个用于 DIRETORIA LIKE this

SETOR DIRETORIA SETOR_ID DIRETORIA_ID
SETOR1 DIRETORIA1 1 1
SETOR1 DIRETORIA2 1 2
SETOR2 DIRETORIA1 2 1
SETOR2 DIRETORIA2 2 2
SETOR2 DIRETORIA3 2 3
SETOR3 DIRETORIA4 3 4
SETOR4 DIRETORIA2 4 2
SETOR5 DIRETORIA2 5 2
SETOR5 DIRETORIA3 5 3

我已经试过了,但是不行。

DATA DETALHE_1;
    SET DADOS;

    BY SETOR DIRETORIA;

    RETAIN SETOR_ID DIRETORIA_ID;

    IF FIRST.SETOR THEN 
        SETOR_ID + 1;

    IF FIRST.DIRETORIA THEN 
        DIRETORIA_ID + 1;
RUN;

我得到了什么

SETOR DIRETORIA SETOR_ID DIRETORIA_ID
SETOR1 DIRETORIA1 1 1
SETOR1 DIRETORIA2 1 2
SETOR2 DIRETORIA1 2 3
SETOR2 DIRETORIA2 2 4
SETOR2 DIRETORIA3 2 5
SETOR3 DIRETORIA4 3 6
SETOR4 DIRETORIA2 4 7
SETOR5 DIRETORIA2 5 8
SETOR5 DIRETORIA3 5 9

SETOR_ID 是正确的,但 DIRETORIA_ID 不正确。

如何解决?

在我看来你只是想数数,而不是任何意义上的索引。

您在 setor 的当前值内计算整个数据集和目录中的 setor。您的样本数据没有任何 diretoria 的重复值,但让我们编写代码,如果您这样做,则给定扇区值内的每个不同值都将被分配相同的计数 ID。

data want;
  set DADOS;
  by setor diretoria;
  setor_id + first.setor;
  diretoria_id + first.diretoria;
  if first.setor then diretoria_id=1;
run;

结果

                                           diretoria_
Obs    SETOR     DIRETORIA     setor_id        id

 1     SETOR1    DIRETORIA1        1            1
 2     SETOR1    DIRETORIA2        1            2
 3     SETOR2    DIRETORIA1        2            1
 4     SETOR2    DIRETORIA2        2            2
 5     SETOR2    DIRETORIA4        2            3
 6     SETOR3    DIRETORIA4        3            1
 7     SETOR4    DIRETORIA2        4            1
 8     SETOR5    DIRETORIA2        5            1
 9     SETOR5    DIRETORIA3        5            2
10     SETOR5    DIRETORIA3        5            2

如果您需要在 setor 的不同值中为 diretoria 的每个值分配相同的数字,那么您将需要不同的方法。一个可以跟踪 diretoria 的哪些值已经分配了一个数字。比如通过构建一个 HASH 对象。在这种情况下,数据不需要按任何一个变量排序,但不同的 setor 和 diretoria 值的数量需要能够放入内存。

data want ;
  set dados;
  if _n_=1 then do;
    declare hash s();
    declare hash d();
    _rc=s.definekey('setor');
    _rc=d.definekey('diretoria');
    _rc=s.definedata('setor_id');
    _rc=d.definedata('diretoria_id');
    _rc=s.definedone();
    _rc=d.definedone();
  end;
  if s.find() then do; _setor+1; setor_id=_setor; _rc=s.add(); end;
  if d.find() then do; _diretoria+1; diretoria_id=_diretoria; _rc=d.add();  end;
  drop _:;
run;

结果:

                                           diretoria_
Obs    SETOR     DIRETORIA     setor_id        id

  1    SETOR1    DIRETORIA1        1            1
  2    SETOR1    DIRETORIA2        1            2
  3    SETOR2    DIRETORIA1        2            1
  4    SETOR2    DIRETORIA2        2            2
  5    SETOR2    DIRETORIA4        2            3
  6    SETOR3    DIRETORIA4        3            3
  7    SETOR4    DIRETORIA2        4            2
  8    SETOR5    DIRETORIA2        5            2
  9    SETOR5    DIRETORIA3        5            4
 10    SETOR5    DIRETORIA3        5            4