forked from caojiguo/FDAworkshop
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdata7.0.sas
More file actions
128 lines (102 loc) · 2.61 KB
/
data7.0.sas
File metadata and controls
128 lines (102 loc) · 2.61 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
/*
Purpose: this macro combine an SDTM domain with SUPP QUAL
inlib is the input data library
insupp is the supp qual domain i.e. suppae
output is a data in the WORK library, i.e. ae
*/
%macro supp(inlib=, insupp=);
%if %sysfunc(exist(&inlib..&insupp)) %then %do;
%let domain=%sysfunc(substr(&insupp,5));
proc sql noprint;
select count(*) into :suppobs from &inlib..&insupp;
%if &suppobs=0 %then %do;
data &domain;
set &inlib..&domain;
run;
data _null_;
put "WARNING: There is no record in &insupp!";
run;
%end;
%else %do;
%if &insupp=suppdm %then %do;
proc sql;
create table t1 as
select distinct qnam, qlabel from &inlib..&insupp;
data _null_;
set t1 end=eof;
i+1;
call symput(compress("qnam"||put(i,best.)), trim(left(qnam)));
call symput(compress("qlabel"||put(i,best.)), trim(left(qlabel)));
if eof then call symput("tot", trim(left(put(_n_,best.))));
run;
%do k=1 %to &tot;
data a&k(keep=usubjid &&qnam&k);
set &inlib..&insupp;
if qnam="&&qnam&k";
&&qnam&k=qval;
label &&qnam&k="&&qlabel&k";
proc sort data=%if &k=1 %then &inlib..&domain; %else &domain; out=&domain; by usubjid;
proc sort data=a&k; by usubjid;
data &domain;
merge &domain(in=a) a&k;
by usubjid;
if a;
run;
%end;
%end;
%else %do;
proc contents data=&inlib..&domain out=a noprint;
proc sql;
create table t1 as
select distinct qnam, qlabel, idvar from &inlib..&insupp;
data _null_;
set t1 end=eof;
i+1;
call symput(compress("qnam"||put(i,best.)), trim(left(qnam)));
call symput(compress("qlabel"||put(i,best.)), trim(left(qlabel)));
call symput(compress("idvar"||put(i,best.)), trim(left(idvar)));
if eof then call symput("tot", trim(left(put(_n_,best.))));
run;
%do k=1 %to &tot;
data _null_; set a;
where name="&&idvar&k";
call symput("varlen", trim(left(put(length,best.))));
call symput("vartype", trim(left(put(type,best.))));
run;
%if &vartype=1 %then %do;
data a&k(keep=usubjid &&qnam&k &&idvar&k);
length &&idvar&k &varlen;
set &inlib..&insupp;
if qnam="&&qnam&k";
&&qnam&k=qval;
&&idvar&k=input(idvarval, best.);
label &&qnam&k="&&qlabel&k";
%end;
%else %do;
data a&k(keep=usubjid &&qnam&k &&idvar&k);
length &&idvar&k $&varlen;
set &inlib..&insupp;
if qnam="&&qnam&k";
&&qnam&k=qval;
&&idvar&k=idvarval;
label &&qnam&k="&&qlabel&k";
%end;
proc sort data=%if &k=1 %then &inlib..&domain; %else &domain; out=&domain; by usubjid &&idvar&k;
proc sort data=a&k; by usubjid &&idvar&k;
data &domain;
merge &domain(in=a) a&k;
by usubjid &&idvar&k;
if a;
run;
%end;
%end;
%end;
%end;
%else %do;
%put Error: The dataset &inlib..&insupp does not exsit.;
%end;
%mend;
/*Example;
options- mprint mlogic symbolgen;
libname- sdtm */
%*supp(inlib=sdtm, insupp=suppae);