我有一个表,其中有几千条记录按不同的主题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
非常感谢任何帮助。 谢谢,
答案 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;