Heres your program. Its a little big and not alligned well :p, but it should do the trick:-
DATA WORK.trial1; LENGTH ID 8 Group 8 Role $ 1 V1me 8 V1D 8 V1M 8 V1O 8 ; FORMAT ID BEST12. Group BEST12. Role $CHAR1. V1me BEST12. V1D BEST12. V1M BEST12. V1O BEST12. ; INFORMAT ID BEST12. Group BEST12. Role $CHAR1. V1me BEST12. V1D BEST12. V1M BEST12. V1O BEST12. ; INFILE "please put your path\filename here"' LRECL=18 ENCODING="WLATIN1" TERMSTR=CRLF DLM='7F'x
MISSOVER DSD ; INPUT ID : BEST32. Group : BEST32. Role : $CHAR1. V1me : BEST32. V1D : BEST32. V1M : BEST32. V1O : BEST32. ; RUN;
DATA K/*(KEEP=ID GROUP ROLE V1ME)*/; SET TRIAL1; RUN;
proc sql; select id,count(id) into :idvars separated by " _num_",:cnt from k; quit;
PROC SORT DATA=K(rename=(v1d=d v1m=m v1o=o));BY id;RUN;
PROC TRANSPOSE DATA=K OUT=L name=role prefix=_num_; BY group; ID id; VAR d m o; RUN; data l; set l; role=upcase(role);
data c(keep=role v1me); set k; run; proc sort data=c;by role; proc sort data=l;by role; data s; merge l(in=a) c; by role; if a; run;
%macro count;
%do i=1 %to &cnt.; data s; set s; %scan(_num_&idvars.,&i.)=%scan(_num_&idvars.,&i.)-v1me; run; %end;
%mend count; %count;
Proc sort data=s;by group ;
proc transpose data=s out=a name=ida; by group ; id role; var _num_&idvars.; run;
data b(drop=ida); set a; id=input(compress(ida,"_num_"),best.); run;
proc sort data=k out=met(keep=id group);by id group; proc sort data=b;by id group;
data t(rename=(D=D_accuracy M=M_Accuracy O=O_Accuracy)); merge met(in=a) b; by id group; if a; run;
the input dataset is trial1 and output dataset is t.
Note:- please change the location in the infile statement. Also let me know if you need any changes.
The output looks like below attached screenshot
... View more