结合多个主题ID' s

时间:2014-05-22 16:13:29

标签: sas rows

我有一个表,其中有几千条记录按不同的主题ID排序,但是在某些情况下,如果主题使用多个id类型,主题名称会出现多次,所以有一次主题使用他们的社交和另一次他们的护照,也许是第三次他们的司机liscense。

数据结构如下。

name            id_type                  id_num
suzy smith      passport                 123
suzy smith      ssn                      123456789
suzy smith      drivers liscense         A3456789

我希望它看起来像这样。

name        id_type      id_num
suzy smith  ssn          123456789
suzy smith  ssn          123456789
suzy smith  ssn          123456789

非常感谢任何帮助。 谢谢,

2 个答案:

答案 0 :(得分:0)

首先按名称对原始数据集进行排序("有"):

proc sort data=have;
    by name;
run;

然后按名称设置测试并将id_type重命名为old_id_type。为id_num做同样的事情。保留id_type和id_num。如果给定记录是个人姓名的第一个实例,则将id_type设置为old_id_type。为id_num做同样的事。

data final;
    set test (rename=(id_type=old_id_type id_num = old_id_num));
    by name;
    retain id_type id_num;
    if first.name then do;
        id_type = old_id_type;
        id_num = old_id_num;
    end;
    drop old_id_type old_id_num;
run;

当您保留变量时,除非您重置该值,否则该值将从一次观察保持到下一次观察。因此,每个人将拥有该名称的所有实例的第一个id_type和id_num。

答案 1 :(得分:0)

我使用了retain语句并添加了更多代码。这是完整的代码:

DATA TEST;
SET C;
BY SUBJ_NAME;
RETAIN N(0);
IF FIRST.SUBJ_NAME THEN N=1;
ELSE N=N+1;
RUN;

PROC SORT
DATA=WORK.TEST
OUT=TTSORTED;
BY SUBJ_NAME N;
RUN;

PROC TRANSPOSE DATA=TTSORTED    
OUT=TTTEST
PREFIX=Column
NAME=Source
LABEL=Label;
BY SUBJ_NAME N ;
VAR SUBJ_INDENT;
RUN; QUIT;
DATA TEST2;
SET TTTEST;
NEW_ID=CATS(SOURCE,N);
RUN; 

PROC SORT
DATA=WORK.TEST2(KEEP=Column1 NEW_ID SUBJ_NAME SBJT_ID)
OUT=WORK.TMP0_INPUT;
BY SUBJ_NAME SBJT_ID;
RUN;

PROC TRANSPOSE DATA=TMP0_INPUT 
OUT=SPLIT_TEST2;
BY SUBJ_NAME;
WHERE SUBJ_NAME NE ' ';
ID NEW_ID ;
VAR Column1;
RUN; QUIT;

DATA X;
SET  SPLIT_TEST2(RENAME = (SUBJ_NAME=SUBJ_NAME_NEW));
IF SUBJ_INDENT2 NE ' ' THEN SUBJ_INDENT3= SUBJ_INDENT2;
IF SUBJ_INDENT2 = ' ' THEN  SUBJ_INDENT3= SUBJ_INDENT1;

KEEP SUBJ_NAME_NEW SUBJ_INDENT1 SUBJ_INDENT2 SUBJ_INDENT3; RUN;