同时创建两个索引
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
是否可以在 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