Utilizing array processing allows us to reduce the amount of coding in the DATA step. In addition to learning how to create one- and multi-dimensional arrays, this paper will review how to create an explicit loop in the DATA step - the prerequisite of constructing an array. You will also be exposed to what happens in the Program Data Vector (PDV) during array processing. A wide range of applications in using loop structures with array processing, such as recoding missing values for a list of variables, transforming datasets, etc., will be covered in this paper.
Salient Features of India constitution especially power and functions
The many ways to effectively utilize array processing
1. The Many Ways to Effectively Utilize Array Processing Arthur Li
2.
3. REVIEW: COMPILATION AND EXECUTION PHASES Compilation phase: Each statement is scanned for syntax errors. Execution phase: The DATA step reads and processes the input data. If there is no syntax error A DATA step is processed in two-phase sequences :
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17. REVIEW EXPLICIT LOOP data trial2(drop = rannum); id = 'M2390' ; rannum = ranuni( 2 ); if rannum> 0.5 then group = 'D' ; else group = 'P' ; output ; id = 'F2390' ; rannum = ranuni( 2 ); if rannum> 0.5 then group = 'D' ; else group = 'P' ; output ; id = 'F2340' ; rannum = ranuni( 2 ); if rannum> 0.5 then group = 'D' ; else group = 'P' ; output ; id = 'M1240' ; rannum = ranuni( 2 ); if rannum> 0.5 then group = 'D' ; else group = 'P' ; output ; run ; Assigning IDs in the DATA step
18. REVIEW EXPLICIT LOOP data trial2(drop = rannum); id = 'M2390' ; rannum = ranuni( 2 ); if rannum> 0.5 then group = 'D' ; else group = 'P' ; output ; id = 'F2390' ; rannum = ranuni( 2 ); if rannum> 0.5 then group = 'D' ; else group = 'P' ; output ; id = 'F2340' ; rannum = ranuni( 2 ); if rannum> 0.5 then group = 'D' ; else group = 'P' ; output ; id = 'M1240' ; rannum = ranuni( 2 ); if rannum> 0.5 then group = 'D' ; else group = 'P' ; output ; run ; 4 explicit OUTPUT statements
19.
20.
21. ITERATIVE DO LOOP data trial2(drop = rannum); id = 'M2390' ; rannum = ranuni( 2 ); if rannum> 0.5 then group = 'D' ; else group = 'P' ; output ; id = 'F2390' ; ... id = 'F2340' ; ... id = 'M1240' ; rannum = ranuni( 2 ); if rannum> 0.5 then group = 'D' ; else group = 'P' ; output ; run ; DO INDEX-VARIABLE = VALUE1, VALUE2, …, VALUEN ; SAS STATEMENTS END; data trial2 (drop = rannum); do id = 'M2390' , 'F2390' , 'F2340' , 'M1240' ; rannum = ranuni( 2 ); if rannum> 0.5 then group = 'D' ; else group = 'P' ; output ; end ; run ;
22.
23.
24.
25. PURPOSE OF USING ARRAYS data sbp1; set sbp; if sbp1 = 999 then sbp1 = . ; if sbp2 = 999 then sbp2 = . ; if sbp3 = 999 then sbp3 = . ; if sbp4 = 999 then sbp4 = . ; if sbp5 = 999 then sbp5 = . ; if sbp6 = 999 then sbp6 = . ; run ; Difference: Variable names If we can group these variables into a single unit We can loop along these variables ARRAY: a temporary grouping of SAS variables 123 121 118 142 140 136 4 999 120 119 139 999 142 3 122 119 119 138 141 999 2 124 116 117 137 142 141 1 sbp6 sbp5 sbp4 sbp3 sbp2 sbp1 6 5 4 3 2 1 SBP
37. ARRAY DEFINITION AND SYNTAX data sbp2 (drop=i); set sbp; array sbparray[ 6 ] sbp1 sbp2 sbp3 sbp4 sbp5 sbp6; do i = 1 to 6 ; if sbparray[i] = 999 then sbparray[i] = . ; end ; run ; data sbp2 (drop=i); set sbp; array sbp [ 6 ]; do i = 1 to 6 ; if sbp [i] = 999 then sbp [i] = . ; end ; run ; ARRAY: array sbparray [ 6 ] sbp1 - sbp6; array sbp [ 6 ]; = array sbp [ 6 ] sbp1 - sbp6; data sbp1; set sbp; if sbp1 = 999 then sbp1 = . ; if sbp2 = 999 then sbp2 = . ; if sbp3 = 999 then sbp3 = . ; if sbp4 = 999 then sbp4 = . ; if sbp5 = 999 then sbp5 = . ; if sbp6 = 999 then sbp6 = . ; run ; 123 121 118 142 140 136 4 999 120 119 139 999 142 3 122 119 119 138 141 999 2 124 116 117 137 142 141 1 sbp6 sbp5 sbp4 sbp3 sbp2 sbp1
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60. SOME ARRAY APPLICATIONS CREATING A GROUP OF VARIABLES BY USING ARRAYS Pre-treatment Post-treatment MEAN SBP: 140 120 data sbp4 (drop=i); set sbp2; array sbp[ 6 ]; array above[ 6 ]; array threshhold[ 6 ] _temporary_ ( 140 140 140 120 120 120 ); do i = 1 to 6 ; if (not missing(sbp[i])) then above [i] = sbp[i] > threshhold[i]; end ; run ; Used to group the existing variables: sbp1 – sbp6 123 121 118 142 140 136 4 . 120 119 139 . 142 3 122 119 119 138 141 . 2 124 116 117 137 142 141 1 sbp6 sbp5 sbp4 sbp3 sbp2 sbp1 1 1 0 1 0 0 4 . 0 0 0 . 1 3 1 0 0 0 1 . 2 1 0 0 0 1 1 1 above6 above5 above4 above3 above2 above1
61. CREATING A GROUP OF VARIABLES BY USING ARRAYS Pre-treatment Post-treatment MEAN SBP: 140 120 data sbp4 (drop=i); set sbp2; array sbp[ 6 ]; array above[ 6 ]; array threshhold[ 6 ] _temporary_ ( 140 140 140 120 120 120 ); do i = 1 to 6 ; if (not missing(sbp[i])) then above [i] = sbp[i] > threshhold[i]; end ; run ; Used to create variables: above1 – above6 123 121 118 142 140 136 4 . 120 119 139 . 142 3 122 119 119 138 141 . 2 124 116 117 137 142 141 1 sbp6 sbp5 sbp4 sbp3 sbp2 sbp1 1 1 0 1 0 0 4 . 0 0 0 . 1 3 1 0 0 0 1 . 2 1 0 0 0 1 1 1 above6 above5 above4 above3 above2 above1
62. CREATING A GROUP OF VARIABLES BY USING ARRAYS Pre-treatment Post-treatment MEAN SBP: 140 120 data sbp4 (drop=i); set sbp2; array sbp[ 6 ]; array above[ 6 ]; array threshhold[ 6 ] _temporary_ ( 140 140 140 120 120 120 ); do i = 1 to 6 ; if (not missing(sbp[i])) then above [i] = sbp[i] > threshhold[i]; end ; run ; The temporary array is for comparison purposes 123 121 118 142 140 136 4 . 120 119 139 . 142 3 122 119 119 138 141 . 2 124 116 117 137 142 141 1 sbp6 sbp5 sbp4 sbp3 sbp2 sbp1 1 1 0 1 0 0 4 . 0 0 0 . 1 3 1 0 0 0 1 . 2 1 0 0 0 1 1 1 above6 above5 above4 above3 above2 above1
63. CREATING A GROUP OF VARIABLES BY USING ARRAYS Pre-treatment Post-treatment MEAN SBP: 140 120 data sbp4 (drop=i); set sbp2; array sbp[ 6 ]; array above[ 6 ]; array threshhold[ 6 ] _temporary_ ( 140 140 140 120 120 120 ); do i = 1 to 6 ; if (not missing(sbp[i])) then above [i] = sbp[i] > threshhold[i]; end ; run ; 123 121 118 142 140 136 4 . 120 119 139 . 142 3 122 119 119 138 141 . 2 124 116 117 137 142 141 1 sbp6 sbp5 sbp4 sbp3 sbp2 sbp1 1 1 0 1 0 0 4 . 0 0 0 . 1 3 1 0 0 0 1 . 2 1 0 0 0 1 1 1 above6 above5 above4 above3 above2 above1
64. THE IN OPERATOR data sbp6 (drop = i); set sbp2; array sbp [6]; if . IN sbp then miss = 1 ; else miss = 0 ; run ; 123 121 118 142 140 136 4 . 120 119 139 . 142 3 122 119 119 138 141 . 2 124 116 117 137 142 141 1 sbp6 sbp5 sbp4 sbp3 sbp2 sbp1 0 1 1 0 miss
65.
66.
67.
68.
69.
70. FROM WIDE FORMAT TO LONG FORMAT(USING ARRAYS) Wide: Long: data long (drop=s1-s3); set wide; time = 1 ; score = s1; if not missing(score) then output ; time = 2 ; score = s2; if not missing(score) then output ; time = 3 ; score = s3; if not missing(score) then output ; run ; array s[ 3 ]; 4 3 S1 . 4 S2 2 A02 2 5 A01 1 S3 ID 3 1 3 2 1 TIME 2 A02 5 4 A02 4 5 A01 3 4 A01 2 3 A01 1 SCORE ID [3] [2] [1] S S[1]; S[2]; S[3];
71. FROM WIDE FORMAT TO LONG FORMAT(USING ARRAYS) Wide: Long: data long (drop=s1-s3); set wide; time = 1 ; score = s1; if not missing(score) then output ; time = 2 ; score = s2; if not missing(score) then output ; time = 3 ; score = s3; if not missing(score) then output ; run ; array s[ 3 ]; Create a DO loop – TIME as index variable 4 3 S1 . 4 S2 2 A02 2 5 A01 1 S3 ID 3 1 3 2 1 TIME 2 A02 5 4 A02 4 5 A01 3 4 A01 2 3 A01 1 SCORE ID [3] [2] [1] S S[1]; S[2]; S[3];
72. FROM WIDE FORMAT TO LONG FORMAT(USING ARRAYS) Wide: Long: data long (drop=s1-s3); set wide; time = 1 ; score = s1; if not missing(score) then output ; time = 2 ; score = s2; if not missing(score) then output ; time = 3 ; score = s3; if not missing(score) then output ; run ; array s[ 3 ]; do time = 1 to 3 ; score = s[time]; if not missing(score) then output ; end ; data long (drop=s1-s3); set wide; array s[ 3 ]; run ; 4 3 S1 . 4 S2 2 A02 2 5 A01 1 S3 ID 3 1 3 2 1 TIME 2 A02 5 4 A02 4 5 A01 3 4 A01 2 3 A01 1 SCORE ID [3] [2] [1] S S[1]; S[2]; S[3];
73.
74.
75.
76.
77.
78.
79.
80.
81.
82. FROM LONG FORMAT TO WIDE FORMAT (WITHOUT USING ARRAYS) RETAIN proc sort data =long; by id; data wide (drop=time score); set long; by id; retain s1 - s3; if time = 1 then s1 = score; else if time = 2 then s2 = score; else s3 = score; if last.id; run ; S3 S1 S3 S2 S1 3 1 3 2 1 TIME 2 A02 5 4 A02 4 5 A01 3 4 A01 2 3 A01 1 SCORE ID 4 3 S1 . 4 S2 2 A02 2 5 A01 1 S3 ID
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. EXECUTION PHASE data wide (drop=time score); set long; by id; retain s1 - s3; if first.id then do ; s1 = . ; s2 = . ; s3 = . ; end ; if time = 1 then s1 = score; else if time = 2 then s2 = score; else s3 = score; if last.id; run ;
112. FROM LONG FORMAT TO WIDE FORMAT (USING ARRAYS) data wide (drop=time score); set long; by id; retain s1 - s3; if first.id then do ; s1 = . ; s2 = . ; s3 = . ; end ; if time = 1 then s1 = score; else if time = 2 then s2 = score; else s3 = score; if last.id; run ; array s[ 3 ]; if first.id then do ; do i = 1 to 3 ; s[i] = . ; end ; end ; retain s; 4 3 S1 . 4 S2 2 A02 2 5 A01 1 S3 ID 3 1 3 2 1 TIME 2 A02 5 4 A02 4 5 A01 3 4 A01 2 3 A01 1 SCORE ID [3] [2] [1] S S[1] S[2] S[3] S[1] S[2] S[3] S[1] S[2] S[3]
113. FROM LONG FORMAT TO WIDE FORMAT (USING ARRAYS) data wide (drop=time score); set long; by id; retain s1 - s3; if first.id then do ; s1 = . ; s2 = . ; s3 = . ; end ; if time = 1 then s1 = score; else if time = 2 then s2 = score; else s3 = score; if last.id; run ; array s[ 3 ]; retain s; 4 3 S1 . 4 S2 2 A02 2 5 A01 1 S3 ID [3] [2] [1] S S[1] S[2] S[3] S[1] S[2] S[3] S[1] S[2] S[3] D LAST.ID D FIRST.ID D _N_ D SCORE D TIME K ID K S3 K S2 K S1 S[3] S[2] S[1] 3 1 3 2 1 TIME 2 A02 5 4 A02 4 5 A01 3 4 A01 2 3 A01 1 SCORE ID
114. FROM LONG FORMAT TO WIDE FORMAT (USING ARRAYS) data wide (drop=time score); set long; by id; retain s1 - s3; if first.id then do ; s1 = . ; s2 = . ; s3 = . ; end ; if time = 1 then s1 = score; else if time = 2 then s2 = score; else s3 = score; if last.id; run ; array s[ 3 ]; S[TIME] 3 retain s; 4 3 S1 . 4 S2 2 A02 2 5 A01 1 S3 ID 3 1 3 2 1 TIME 2 A02 5 4 A02 4 5 A01 3 4 A01 2 3 A01 1 SCORE ID [3] [2] [1] S S[1] S[2] S[3] S[1] S[2] S[3] S[1] S[2] S[3] 0 1 1 D LAST.ID D FIRST.ID D _N_ 3 1 A01 D SCORE D TIME K ID . . . K S3 K S2 K S1 S[3] S[2] S[1]
115. FROM LONG FORMAT TO WIDE FORMAT (USING ARRAYS) data wide (drop=time score); set long; by id; retain s1 - s3; if first.id then do ; s1 = . ; s2 = . ; s3 = . ; end ; if time = 1 then s1 = score; else if time = 2 then s2 = score; else s3 = score; if last.id; run ; array s[ 3 ]; S[TIME] 3 4 retain s; 4 3 S1 . 4 S2 2 A02 2 5 A01 1 S3 ID 3 1 3 2 1 TIME 2 A02 5 4 A02 4 5 A01 3 4 A01 2 3 A01 1 SCORE ID [3] [2] [1] S S[1] S[2] S[3] S[1] S[2] S[3] S[1] S[2] S[3] 0 0 2 D LAST.ID D FIRST.ID D _N_ 4 2 A01 D SCORE D TIME K ID . . . K S3 K S2 K S1 S[3] S[2] S[1]
116. FROM LONG FORMAT TO WIDE FORMAT (USING ARRAYS) data wide (drop=time score); set long; by id; retain s1 - s3; if first.id then do ; s1 = . ; s2 = . ; s3 = . ; end ; if time = 1 then s1 = score; else if time = 2 then s2 = score; else s3 = score; if last.id; run ; array s[ 3 ]; s[time] = score; retain s; 4 3 S1 . 4 S2 2 A02 2 5 A01 1 S3 ID 3 1 3 2 1 TIME 2 A02 5 4 A02 4 5 A01 3 4 A01 2 3 A01 1 SCORE ID [3] [2] [1] S S[1] S[2] S[3] S[1] S[2] S[3] S[1] S[2] S[3]
117. FROM LONG FORMAT TO WIDE FORMAT (USING ARRAYS) data wide (drop=time score); set long; by id; retain s1 - s3; if first.id then do ; s1 = . ; s2 = . ; s3 = . ; end ; if time = 1 then s1 = score; else if time = 2 then s2 = score; else s3 = score; if last.id; run ; array s[ 3 ]; if first.id then do ; do i = 1 to 3 ; s[i] = . ; end ; end ; s[time] = score; if last.id; run ; data wide (drop = time score i); set long; by id; array s[ 3 ]; retain s; retain s; 4 3 S1 . 4 S2 2 A02 2 5 A01 1 S3 ID 3 1 3 2 1 TIME 2 A02 5 4 A02 4 5 A01 3 4 A01 2 3 A01 1 SCORE ID [3] [2] [1] S S[1] S[2] S[3] S[1] S[2] S[3] S[1] S[2] S[3]
121. RESTRUCTURING DATASETS BY USING THE MULTIDIMENSIONAL ARRAY Dat1: Dat2: G[3]: ALL_G[2,3]: Use to group existing variables Use to create new variables RETAIN i + 1; B A A B G2 C C 2 4 D B 2 3 C B 1 2 F A 1 1 G3 G1 ID C C F_ G3 C B F_ G1 D F M_ G3 A B M_ G2 B B 2 2 A A 1 1 F_ G2 M_ G1 ID G3 G2 G1 3 2 1 F_G3 F_G2 F_G1 2 1 M_G3 M_G2 M_G1 3 2 1 ALL_G [2,1] ALL_G [2,2] ALL_G [2,3] ALL_G [1,3] ALL_G [1,2] ALL_G [1,1] G[3] G[2] G[1]
122. RESTRUCTURING DATASETS BY USING THE MULTIDIMENSIONAL ARRAY proc sort data =dat1; by id; run ; data dat2 (drop = i j g1 - g3); set dat1; by id; array all_g [ 2 , 3 ] $ m_g1 - m_g3 f_g1 - f_g3; array g[ 3 ]; retain all_g; if first.id then i = 0 ; i + 1 ; do j = 1 to 3 ; all_g[i,j] = g[j]; end ; if last.id; run ;
123. RESTRUCTURING DATASETS BY USING THE MULTIDIMENSIONAL ARRAY data dat2 (drop = i j g1 - g3); set dat1; by id; array all_g [ 2 , 3 ] $ m_g1 - m_g3 f_g1 - f_g3; array g[ 3 ]; retain all_g; if first.id then i = 0 ; i + 1 ; do j = 1 to 3 ; all_g[i,j] = g[j]; end ; if last.id; run ; ALL_G [I,J] Dat1: At the beginning of the 1 st iteration: G [J] ARRAY TRACKING B A A B G2 C C 2 4 D B 2 3 C B 1 2 F A 1 1 G3 G1 ID 0 I D . G1 D . G2 D . G3 D . ID K 1 LAST.ID D . 1 1 D J D FIRST.ID D _N_ . F_G2 K . F_G3 K . F_G1 K . M_G3 K . . K M_G2 K M_G1 ALL_G [2,1] ALL_G [2,2] ALL_G [2,3] ALL_G [1,3] ALL_G [1,2] ALL_G [1,1] G[3] G[2] G[1] F_G3 F_G2 F_G1 2 1 M_G3 M_G2 M_G1 3 2 1 G3 G2 G1
124. RESTRUCTURING DATASETS BY USING THE MULTIDIMENSIONAL ARRAY Dat1: 1 st iteration: ALL_G [I,J] G [J] data dat2 (drop = i j g1 - g3); set dat1; by id; array all_g [ 2 , 3 ] $ m_g1 - m_g3 f_g1 - f_g3; array g[ 3 ]; retain all_g; if first.id then i = 0 ; i + 1 ; do j = 1 to 3 ; all_g[i,j] = g[j]; end ; if last.id; run ; B A A B G2 C C 2 4 D B 2 3 C B 1 2 F A 1 1 G3 G1 ID 0 I D A G1 D B G2 D F G3 D 1 ID K 0 LAST.ID D . 1 1 D J D FIRST.ID D _N_ . F_G2 K . F_G3 K . F_G1 K . M_G3 K . . K M_G2 K M_G1 ALL_G [2,1] ALL_G [2,2] ALL_G [2,3] ALL_G [1,3] ALL_G [1,2] ALL_G [1,1] G[3] G[2] G[1] F_G3 F_G2 F_G1 2 1 M_G3 M_G2 M_G1 3 2 1 G3 G2 G1
125. RESTRUCTURING DATASETS BY USING THE MULTIDIMENSIONAL ARRAY Dat1: 1 st iteration: ALL_G [I,J] G [J] data dat2 (drop = i j g1 - g3); set dat1; by id; array all_g [ 2 , 3 ] $ m_g1 - m_g3 f_g1 - f_g3; array g[ 3 ]; retain all_g; if first.id then i = 0 ; i + 1 ; do j = 1 to 3 ; all_g[i,j] = g[j]; end ; if last.id; run ; B A A B G2 C C 2 4 D B 2 3 C B 1 2 F A 1 1 G3 G1 ID 0 I D A G1 D B G2 D F G3 D 1 ID K 0 LAST.ID D . 1 1 D J D FIRST.ID D _N_ . F_G2 K . F_G3 K . F_G1 K . M_G3 K . . K M_G2 K M_G1 ALL_G [2,1] ALL_G [2,2] ALL_G [2,3] ALL_G [1,3] ALL_G [1,2] ALL_G [1,1] G[3] G[2] G[1] F_G3 F_G2 F_G1 2 1 M_G3 M_G2 M_G1 3 2 1 G3 G2 G1
126. RESTRUCTURING DATASETS BY USING THE MULTIDIMENSIONAL ARRAY Dat1: 1 st iteration: ALL_G [I,J] G [J] data dat2 (drop = i j g1 - g3); set dat1; by id; array all_g [ 2 , 3 ] $ m_g1 - m_g3 f_g1 - f_g3; array g[ 3 ]; retain all_g; if first.id then i = 0 ; i + 1 ; do j = 1 to 3 ; all_g[i,j] = g[j]; end ; if last.id; run ; B A A B G2 C C 2 4 D B 2 3 C B 1 2 F A 1 1 G3 G1 ID 1 I D A G1 D B G2 D F G3 D 1 ID K 0 LAST.ID D . 1 1 D J D FIRST.ID D _N_ . F_G2 K . F_G3 K . F_G1 K . M_G3 K . . K M_G2 K M_G1 ALL_G [2,1] ALL_G [2,2] ALL_G [2,3] ALL_G [1,3] ALL_G [1,2] ALL_G [1,1] G[3] G[2] G[1] F_G3 F_G2 F_G1 2 1 M_G3 M_G2 M_G1 3 2 1 G3 G2 G1
127. RESTRUCTURING DATASETS BY USING THE MULTIDIMENSIONAL ARRAY Dat1: 1 st iteration (1 st DO loop): ALL_G [I,J] G [J] data dat2 (drop = i j g1 - g3); set dat1; by id; array all_g [ 2 , 3 ] $ m_g1 - m_g3 f_g1 - f_g3; array g[ 3 ]; retain all_g; if first.id then i = 0 ; i + 1 ; do j = 1 to 3 ; all_g[i,j] = g[j]; end ; if last.id; run ; B A A B G2 C C 2 4 D B 2 3 C B 1 2 F A 1 1 G3 G1 ID 1 I D A G1 D B G2 D F G3 D 1 ID K 0 LAST.ID D 1 1 1 D J D FIRST.ID D _N_ . F_G2 K . F_G3 K . F_G1 K . M_G3 K . . K M_G2 K M_G1 ALL_G [2,1] ALL_G [2,2] ALL_G [2,3] ALL_G [1,3] ALL_G [1,2] ALL_G [1,1] G[3] G[2] G[1] F_G3 F_G2 F_G1 2 1 M_G3 M_G2 M_G1 3 2 1 G3 G2 G1
128. RESTRUCTURING DATASETS BY USING THE MULTIDIMENSIONAL ARRAY Dat1: 1 st iteration (1 st DO loop): ALL_G [I,J] G [J] data dat2 (drop = i j g1 - g3); set dat1; by id; array all_g [ 2 , 3 ] $ m_g1 - m_g3 f_g1 - f_g3; array g[ 3 ]; retain all_g; if first.id then i = 0 ; i + 1 ; do j = 1 to 3 ; all_g[i,j] = g[j]; end ; if last.id; run ; B A A B G2 C C 2 4 D B 2 3 C B 1 2 F A 1 1 G3 G1 ID 1 I D A G1 D B G2 D F G3 D 1 ID K 0 LAST.ID D 1 1 1 D J D FIRST.ID D _N_ . F_G2 K . F_G3 K . F_G1 K . M_G3 K . A K M_G2 K M_G1 ALL_G [2,1] ALL_G [2,2] ALL_G [2,3] ALL_G [1,3] ALL_G [1,2] ALL_G [1,1] G[3] G[2] G[1] F_G3 F_G2 F_G1 2 1 M_G3 M_G2 M_G1 3 2 1 G3 G2 G1
129. RESTRUCTURING DATASETS BY USING THE MULTIDIMENSIONAL ARRAY Dat1: 1 st iteration (1 st DO loop): ALL_G [I,J] G [J] data dat2 (drop = i j g1 - g3); set dat1; by id; array all_g [ 2 , 3 ] $ m_g1 - m_g3 f_g1 - f_g3; array g[ 3 ]; retain all_g; if first.id then i = 0 ; i + 1 ; do j = 1 to 3 ; all_g[i,j] = g[j]; end ; if last.id; run ; B A A B G2 C C 2 4 D B 2 3 C B 1 2 F A 1 1 G3 G1 ID 1 I D A G1 D B G2 D F G3 D 1 ID K 0 LAST.ID D 1 1 1 D J D FIRST.ID D _N_ . F_G2 K . F_G3 K . F_G1 K . M_G3 K . A K M_G2 K M_G1 ALL_G [2,1] ALL_G [2,2] ALL_G [2,3] ALL_G [1,3] ALL_G [1,2] ALL_G [1,1] G[3] G[2] G[1] F_G3 F_G2 F_G1 2 1 M_G3 M_G2 M_G1 3 2 1 G3 G2 G1
130. RESTRUCTURING DATASETS BY USING THE MULTIDIMENSIONAL ARRAY Dat1: 1 st iteration (2 nd DO loop): ALL_G [I,J] G [J] data dat2 (drop = i j g1 - g3); set dat1; by id; array all_g [ 2 , 3 ] $ m_g1 - m_g3 f_g1 - f_g3; array g[ 3 ]; retain all_g; if first.id then i = 0 ; i + 1 ; do j = 1 to 3 ; all_g[i,j] = g[j]; end ; if last.id; run ; B A A B G2 C C 2 4 D B 2 3 C B 1 2 F A 1 1 G3 G1 ID 1 I D A G1 D B G2 D F G3 D 1 ID K 0 LAST.ID D 2 1 1 D J D FIRST.ID D _N_ . F_G2 K . F_G3 K . F_G1 K . M_G3 K . A K M_G2 K M_G1 ALL_G [2,1] ALL_G [2,2] ALL_G [2,3] ALL_G [1,3] ALL_G [1,2] ALL_G [1,1] G[3] G[2] G[1] F_G3 F_G2 F_G1 2 1 M_G3 M_G2 M_G1 3 2 1 G3 G2 G1
131. RESTRUCTURING DATASETS BY USING THE MULTIDIMENSIONAL ARRAY Dat1: 1 st iteration (2 nd DO loop): ALL_G [I,J] G [J] data dat2 (drop = i j g1 - g3); set dat1; by id; array all_g [ 2 , 3 ] $ m_g1 - m_g3 f_g1 - f_g3; array g[ 3 ]; retain all_g; if first.id then i = 0 ; i + 1 ; do j = 1 to 3 ; all_g[i,j] = g[j]; end ; if last.id; run ; B A A B G2 C C 2 4 D B 2 3 C B 1 2 F A 1 1 G3 G1 ID 1 I D A G1 D B G2 D F G3 D 1 ID K 0 LAST.ID D 2 1 1 D J D FIRST.ID D _N_ . F_G2 K . F_G3 K . F_G1 K . M_G3 K B A K M_G2 K M_G1 ALL_G [2,1] ALL_G [2,2] ALL_G [2,3] ALL_G [1,3] ALL_G [1,2] ALL_G [1,1 ] G[3] G[2] G[1] F_G3 F_G2 F_G1 2 1 M_G3 M_G2 M_G1 3 2 1 G3 G2 G1
132. RESTRUCTURING DATASETS BY USING THE MULTIDIMENSIONAL ARRAY Dat1: 1 st iteration (2 nd DO loop): ALL_G [I,J] G [J] data dat2 (drop = i j g1 - g3); set dat1; by id; array all_g [ 2 , 3 ] $ m_g1 - m_g3 f_g1 - f_g3; array g[ 3 ]; retain all_g; if first.id then i = 0 ; i + 1 ; do j = 1 to 3 ; all_g[i,j] = g[j]; end ; if last.id; run ; B A A B G2 C C 2 4 D B 2 3 C B 1 2 F A 1 1 G3 G1 ID 1 I D A G1 D B G2 D F G3 D 1 ID K 0 LAST.ID D 2 1 1 D J D FIRST.ID D _N_ . F_G2 K . F_G3 K . F_G1 K . M_G3 K B A K M_G2 K M_G1 ALL_G [2,1] ALL_G [2,2] ALL_G [2,3] ALL_G [1,3] ALL_G [1,2] ALL_G [1,1] G[3] G[2] G[1] F_G3 F_G2 F_G1 2 1 M_G3 M_G2 M_G1 3 2 1 G3 G2 G1
133. RESTRUCTURING DATASETS BY USING THE MULTIDIMENSIONAL ARRAY Dat1: 1 st iteration (3 rd DO loop): ALL_G [I,J] G [J] data dat2 (drop = i j g1 - g3); set dat1; by id; array all_g [ 2 , 3 ] $ m_g1 - m_g3 f_g1 - f_g3; array g[ 3 ]; retain all_g; if first.id then i = 0 ; i + 1 ; do j = 1 to 3 ; all_g[i,j] = g[j]; end ; if last.id; run ; B A A B G2 C C 2 4 D B 2 3 C B 1 2 F A 1 1 G3 G1 ID 1 I D A G1 D B G2 D F G3 D 1 ID K 0 LAST.ID D 3 1 1 D J D FIRST.ID D _N_ . F_G2 K . F_G3 K . F_G1 K . M_G3 K B A K M_G2 K M_G1 ALL_G [2,1] ALL_G [2,2] ALL_G [2,3] ALL_G [1,3] ALL_G [1,2] ALL_G [1,1 ] G[3] G[2] G[1] F_G3 F_G2 F_G1 2 1 M_G3 M_G2 M_G1 3 2 1 G3 G2 G1
134. RESTRUCTURING DATASETS BY USING THE MULTIDIMENSIONAL ARRAY Dat1: 1 st iteration (3 rd DO loop): ALL_G [I,J] G [J] data dat2 (drop = i j g1 - g3); set dat1; by id; array all_g [ 2 , 3 ] $ m_g1 - m_g3 f_g1 - f_g3; array g[ 3 ]; retain all_g; if first.id then i = 0 ; i + 1 ; do j = 1 to 3 ; all_g[i,j] = g[j]; end ; if last.id; run ; B A A B G2 C C 2 4 D B 2 3 C B 1 2 F A 1 1 G3 G1 ID 1 I D A G1 D B G2 D F G3 D 1 ID K 0 LAST.ID D 3 1 1 D J D FIRST.ID D _N_ . F_G2 K . F_G3 K . F_G1 K F M_G3 K B A K M_G2 K M_G1 ALL_G [2,1] ALL_G [2,2] ALL_G [2,3] ALL_G [1,3] ALL_G [1,2] ALL_G [1,1] G[3] G[2] G[1] F_G3 F_G2 F_G1 2 1 M_G3 M_G2 M_G1 3 2 1 G3 G2 G1
135. RESTRUCTURING DATASETS BY USING THE MULTIDIMENSIONAL ARRAY Dat1: 1 st iteration (3 rd DO loop): ALL_G [I,J] G [J] data dat2 (drop = i j g1 - g3); set dat1; by id; array all_g [ 2 , 3 ] $ m_g1 - m_g3 f_g1 - f_g3; array g[ 3 ]; retain all_g; if first.id then i = 0 ; i + 1 ; do j = 1 to 3 ; all_g[i,j] = g[j]; end ; if last.id; run ; B A A B G2 C C 2 4 D B 2 3 C B 1 2 F A 1 1 G3 G1 ID 1 I D A G1 D B G2 D F G3 D 1 ID K 0 LAST.ID D 3 1 1 D J D FIRST.ID D _N_ . F_G2 K . F_G3 K . F_G1 K F M_G3 K B A K M_G2 K M_G1 ALL_G [2,1] ALL_G [2,2] ALL_G [2,3] ALL_G [1,3] ALL_G [1,2] ALL_G [1,1] G[3] G[2] G[1] F_G3 F_G2 F_G1 2 1 M_G3 M_G2 M_G1 3 2 1 G3 G2 G1
136. RESTRUCTURING DATASETS BY USING THE MULTIDIMENSIONAL ARRAY Dat1: 1 st iteration (4 th DO loop): ALL_G [I,J] G [J] data dat2 (drop = i j g1 - g3); set dat1; by id; array all_g [ 2 , 3 ] $ m_g1 - m_g3 f_g1 - f_g3; array g[ 3 ]; retain all_g; if first.id then i = 0 ; i + 1 ; do j = 1 to 3 ; all_g[i,j] = g[j]; end ; if last.id; run ; B A A B G2 C C 2 4 D B 2 3 C B 1 2 F A 1 1 G3 G1 ID 1 I D A G1 D B G2 D F G3 D 1 ID K 0 LAST.ID D 4 1 1 D J D FIRST.ID D _N_ . F_G2 K . F_G3 K . F_G1 K F M_G3 K B A K M_G2 K M_G1 ALL_G [2,1] ALL_G [2,2] ALL_G [2,3] ALL_G [1,3] ALL_G [1,2] ALL_G [1,1] G[3] G[2] G[1] F_G3 F_G2 F_G1 2 1 M_G3 M_G2 M_G1 3 2 1 G3 G2 G1
137. RESTRUCTURING DATASETS BY USING THE MULTIDIMENSIONAL ARRAY Dat1: 1 st iteration: ALL_G [I,J] G [J] data dat2 (drop = i j g1 - g3); set dat1; by id; array all_g [ 2 , 3 ] $ m_g1 - m_g3 f_g1 - f_g3; array g[ 3 ]; retain all_g; if first.id then i = 0 ; i + 1 ; do j = 1 to 3 ; all_g[i,j] = g[j]; end ; if last.id; run ; B A A B G2 C C 2 4 D B 2 3 C B 1 2 F A 1 1 G3 G1 ID 1 I D A G1 D B G2 D F G3 D 1 ID K 0 LAST.ID D 4 1 1 D J D FIRST.ID D _N_ . F_G2 K . F_G3 K . F_G1 K F M_G3 K B A K M_G2 K M_G1 ALL_G [2,1] ALL_G [2,2] ALL_G [2,3] ALL_G [1,3] ALL_G [1,2] ALL_G [1,1] G[3] G[2] G[1] F_G3 F_G2 F_G1 2 1 M_G3 M_G2 M_G1 3 2 1 G3 G2 G1
138. RESTRUCTURING DATASETS BY USING THE MULTIDIMENSIONAL ARRAY Dat1: 2 nd iteration: ALL_G [I,J] G [J] data dat2 (drop = i j g1 - g3); set dat1; by id; array all_g [ 2 , 3 ] $ m_g1 - m_g3 f_g1 - f_g3; array g[ 3 ]; retain all_g; if first.id then i = 0 ; i + 1 ; do j = 1 to 3 ; all_g[i,j] = g[j]; end ; if last.id; run ; B A A B G2 C C 2 4 D B 2 3 C B 1 2 F A 1 1 G3 G1 ID 1 I D A G1 D B G2 D F G3 D 1 ID K 0 LAST.ID D . 1 2 D J D FIRST.ID D _N_ . F_G2 K . F_G3 K . F_G1 K F M_G3 K B A K M_G2 K M_G1 ALL_G [2,1] ALL_G [2,2] ALL_G [2,3] ALL_G [1,3] ALL_G [1,2] ALL_G [1,1] G[3] G[2] G[1] F_G3 F_G2 F_G1 2 1 M_G3 M_G2 M_G1 3 2 1 G3 G2 G1
139. RESTRUCTURING DATASETS BY USING THE MULTIDIMENSIONAL ARRAY Dat1: 2 nd iteration: ALL_G [I,J] G [J] data dat2 (drop = i j g1 - g3); set dat1; by id; array all_g [ 2 , 3 ] $ m_g1 - m_g3 f_g1 - f_g3; array g[ 3 ]; retain all_g; if first.id then i = 0 ; i + 1 ; do j = 1 to 3 ; all_g[i,j] = g[j]; end ; if last.id; run ; B A A B G2 C C 2 4 D B 2 3 C B 1 2 F A 1 1 G3 G1 ID 1 I D B G1 D A G2 D C G3 D 1 ID K 1 LAST.ID D . 0 2 D J D FIRST.ID D _N_ . F_G2 K . F_G3 K . F_G1 K F M_G3 K B A K M_G2 K M_G1 ALL_G [2,1] ALL_G [2,2] ALL_G [2,3] ALL_G [1,3] ALL_G [1,2] ALL_G [1,1] G[3] G[2] G[1] F_G3 F_G2 F_G1 2 1 M_G3 M_G2 M_G1 3 2 1 G3 G2 G1
140. RESTRUCTURING DATASETS BY USING THE MULTIDIMENSIONAL ARRAY Dat1: 2 nd iteration: ALL_G [I,J] G [J] data dat2 (drop = i j g1 - g3); set dat1; by id; array all_g [ 2 , 3 ] $ m_g1 - m_g3 f_g1 - f_g3; array g[ 3 ]; retain all_g; if first.id then i = 0 ; i + 1 ; do j = 1 to 3 ; all_g[i,j] = g[j]; end ; if last.id; run ; B A A B G2 C C 2 4 D B 2 3 C B 1 2 F A 1 1 G3 G1 ID 1 I D B G1 D A G2 D C G3 D 1 ID K 1 LAST.ID D . 0 2 D J D FIRST.ID D _N_ . F_G2 K . F_G3 K . F_G1 K F M_G3 K B A K M_G2 K M_G1 ALL_G [2,1] ALL_G [2,2] ALL_G [2,3] ALL_G [1,3] ALL_G [1,2] ALL_G [1,1] G[3] G[2] G[1] F_G3 F_G2 F_G1 2 1 M_G3 M_G2 M_G1 3 2 1 G3 G2 G1
141. RESTRUCTURING DATASETS BY USING THE MULTIDIMENSIONAL ARRAY Dat1: 2 nd iteration: ALL_G [I,J] G [J] data dat2 (drop = i j g1 - g3); set dat1; by id; array all_g [ 2 , 3 ] $ m_g1 - m_g3 f_g1 - f_g3; array g[ 3 ]; retain all_g; if first.id then i = 0 ; i + 1 ; do j = 1 to 3 ; all_g[i,j] = g[j]; end ; if last.id; run ; B A A B G2 C C 2 4 D B 2 3 C B 1 2 F A 1 1 G3 G1 ID 2 I D B G1 D A G2 D C G3 D 1 ID K 1 LAST.ID D . 0 2 D J D FIRST.ID D _N_ . F_G2 K . F_G3 K . F_G1 K F M_G3 K B A K M_G2 K M_G1 ALL_G [2,1] ALL_G [2,2] ALL_G [2,3] ALL_G [1,3] ALL_G [1,2] ALL_G [1,1] G[3] G[2] G[1] F_G3 F_G2 F_G1 2 1 M_G3 M_G2 M_G1 3 2 1 G3 G2 G1
142. RESTRUCTURING DATASETS BY USING THE MULTIDIMENSIONAL ARRAY Dat1: 2 nd iteration (1 st DO loop): ALL_G [I,J] G [J] data dat2 (drop = i j g1 - g3); set dat1; by id; array all_g [ 2 , 3 ] $ m_g1 - m_g3 f_g1 - f_g3; array g[ 3 ]; retain all_g; if first.id then i = 0 ; i + 1 ; do j = 1 to 3 ; all_g[i,j] = g[j]; end ; if last.id; run ; B A A B G2 C C 2 4 D B 2 3 C B 1 2 F A 1 1 G3 G1 ID 2 I D B G1 D A G2 D C G3 D 1 ID K 1 LAST.ID D 1 0 2 D J D FIRST.ID D _N_ . F_G2 K . F_G3 K . F_G1 K F M_G3 K B A K M_G2 K M_G1 ALL_G [2,1] ALL_G [2,2] ALL_G [2,3] ALL_G [1,3] ALL_G [1,2] ALL_G [1,1] G[3] G[2] G[1] F_G3 F_G2 F_G1 2 1 M_G3 M_G2 M_G1 3 2 1 G3 G2 G1
143. RESTRUCTURING DATASETS BY USING THE MULTIDIMENSIONAL ARRAY Dat1: 2 nd iteration (1 st DO loop): ALL_G [I,J] G [J] data dat2 (drop = i j g1 - g3); set dat1; by id; array all_g [ 2 , 3 ] $ m_g1 - m_g3 f_g1 - f_g3; array g[ 3 ]; retain all_g; if first.id then i = 0 ; i + 1 ; do j = 1 to 3 ; all_g[i,j] = g[j]; end ; if last.id; run ; B A A B G2 C C 2 4 D B 2 3 C B 1 2 F A 1 1 G3 G1 ID 2 I D B G1 D A G2 D C G3 D 1 ID K 1 LAST.ID D 1 0 2 D J D FIRST.ID D _N_ . F_G2 K . F_G3 K B F_G1 K F M_G3 K B A K M_G2 K M_G1 ALL_G [2,1] ALL_G [2,2] ALL_G [2,3] ALL_G [1,3] ALL_G [1,2] ALL_G [1,1] G[3] G[2] G[1] F_G3 F_G2 F_G1 2 1 M_G3 M_G2 M_G1 3 2 1 G3 G2 G1
144. RESTRUCTURING DATASETS BY USING THE MULTIDIMENSIONAL ARRAY Dat1: 2 nd iteration (1 st DO loop): ALL_G [I,J] G [J] data dat2 (drop = i j g1 - g3); set dat1; by id; array all_g [ 2 , 3 ] $ m_g1 - m_g3 f_g1 - f_g3; array g[ 3 ]; retain all_g; if first.id then i = 0 ; i + 1 ; do j = 1 to 3 ; all_g[i,j] = g[j]; end ; if last.id; run ; B A A B G2 C C 2 4 D B 2 3 C B 1 2 F A 1 1 G3 G1 ID 2 I D B G1 D A G2 D C G3 D 1 ID K 1 LAST.ID D 1 0 2 D J D FIRST.ID D _N_ . F_G2 K . F_G3 K B F_G1 K F M_G3 K B A K M_G2 K M_G1 ALL_G [2,1] ALL_G [2,2] ALL_G [2,3] ALL_G [1,3] ALL_G [1,2] ALL_G [1,1] G[3] G[2] G[1] F_G3 F_G2 F_G1 2 1 M_G3 M_G2 M_G1 3 2 1 G3 G2 G1
145. RESTRUCTURING DATASETS BY USING THE MULTIDIMENSIONAL ARRAY Dat1: 2 nd iteration (2 nd DO loop): ALL_G [I,J] G [J] data dat2 (drop = i j g1 - g3); set dat1; by id; array all_g [ 2 , 3 ] $ m_g1 - m_g3 f_g1 - f_g3; array g[ 3 ]; retain all_g; if first.id then i = 0 ; i + 1 ; do j = 1 to 3 ; all_g[i,j] = g[j]; end ; if last.id; run ; B A A B G2 C C 2 4 D B 2 3 C B 1 2 F A 1 1 G3 G1 ID 2 I D B G1 D A G2 D C G3 D 1 ID K 1 LAST.ID D 2 0 2 D J D FIRST.ID D _N_ . F_G2 K . F_G3 K B F_G1 K F M_G3 K B A K M_G2 K M_G1 ALL_G [2,1] ALL_G [2,2] ALL_G [2,3] ALL_G [1,3] ALL_G [1,2] ALL_G [1,1] G[3] G[2] G[1] F_G3 F_G2 F_G1 2 1 M_G3 M_G2 M_G1 3 2 1 G3 G2 G1
146. RESTRUCTURING DATASETS BY USING THE MULTIDIMENSIONAL ARRAY Dat1: 2 nd iteration (2 nd DO loop): ALL_G [I,J] G [J] data dat2 (drop = i j g1 - g3); set dat1; by id; array all_g [ 2 , 3 ] $ m_g1 - m_g3 f_g1 - f_g3; array g[ 3 ]; retain all_g; if first.id then i = 0 ; i + 1 ; do j = 1 to 3 ; all_g[i,j] = g[j]; end ; if last.id; run ; B A A B G2 C C 2 4 D B 2 3 C B 1 2 F A 1 1 G3 G1 ID 2 I D B G1 D A G2 D C G3 D 1 ID K 1 LAST.ID D 2 0 2 D J D FIRST.ID D _N_ A F_G2 K . F_G3 K B F_G1 K F M_G3 K B A K M_G2 K M_G1 ALL_G [2,1] ALL_G [2,2] ALL_G [2,3] ALL_G [1,3] ALL_G [1,2] ALL_G [1,1] G[3] G[2] G[1] F_G3 F_G2 F_G1 2 1 M_G3 M_G2 M_G1 3 2 1 G3 G2 G1
147. RESTRUCTURING DATASETS BY USING THE MULTIDIMENSIONAL ARRAY Dat1: 2 nd iteration (2 nd DO loop): ALL_G [I,J] G [J] data dat2 (drop = i j g1 - g3); set dat1; by id; array all_g [ 2 , 3 ] $ m_g1 - m_g3 f_g1 - f_g3; array g[ 3 ]; retain all_g; if first.id then i = 0 ; i + 1 ; do j = 1 to 3 ; all_g[i,j] = g[j]; end ; if last.id; run ; B A A B G2 C C 2 4 D B 2 3 C B 1 2 F A 1 1 G3 G1 ID 2 I D B G1 D A G2 D C G3 D 1 ID K 1 LAST.ID D 2 0 2 D J D FIRST.ID D _N_ A F_G2 K . F_G3 K B F_G1 K F M_G3 K B A K M_G2 K M_G1 ALL_G [2,1] ALL_G [2,2] ALL_G [2,3] ALL_G [1,3] ALL_G [1,2] ALL_G [1,1] G[3] G[2] G[1] F_G3 F_G2 F_G1 2 1 M_G3 M_G2 M_G1 3 2 1 G3 G2 G1
148. RESTRUCTURING DATASETS BY USING THE MULTIDIMENSIONAL ARRAY Dat1: 2 nd iteration (3 rd DO loop): ALL_G [I,J] G [J] data dat2 (drop = i j g1 - g3); set dat1; by id; array all_g [ 2 , 3 ] $ m_g1 - m_g3 f_g1 - f_g3; array g[ 3 ]; retain all_g; if first.id then i = 0 ; i + 1 ; do j = 1 to 3 ; all_g[i,j] = g[j]; end ; if last.id; run ; B A A B G2 C C 2 4 D B 2 3 C B 1 2 F A 1 1 G3 G1 ID 2 I D B G1 D A G2 D C G3 D 1 ID K 1 LAST.ID D 3 0 2 D J D FIRST.ID D _N_ A F_G2 K . F_G3 K B F_G1 K F M_G3 K B A K M_G2 K M_G1 ALL_G [2,1] ALL_G [2,2] ALL_G [2,3] ALL_G [1,3] ALL_G [1,2] ALL_G [1,1] G[3] G[2] G[1] F_G3 F_G2 F_G1 2 1 M_G3 M_G2 M_G1 3 2 1 G3 G2 G1
149. RESTRUCTURING DATASETS BY USING THE MULTIDIMENSIONAL ARRAY Dat1: 2 nd iteration (3 rd DO loop): ALL_G [I,J] G [J] data dat2 (drop = i j g1 - g3); set dat1; by id; array all_g [ 2 , 3 ] $ m_g1 - m_g3 f_g1 - f_g3; array g[ 3 ]; retain all_g; if first.id then i = 0 ; i + 1 ; do j = 1 to 3 ; all_g[i,j] = g[j]; end ; if last.id; run ; B A A B G2 C C 2 4 D B 2 3 C B 1 2 F A 1 1 G3 G1 ID 2 I D B G1 D A G2 D C G3 D 1 ID K 1 LAST.ID D 3 0 2 D J D FIRST.ID D _N_ A F_G2 K C F_G3 K B F_G1 K F M_G3 K B A K M_G2 K M_G1 ALL_G [2,1] ALL_G [2,2] ALL_G [2,3] ALL_G [1,3] ALL_G [1,2] ALL_G [1,1] G[3] G[2] G[1] F_G3 F_G2 F_G1 2 1 M_G3 M_G2 M_G1 3 2 1 G3 G2 G1
150. RESTRUCTURING DATASETS BY USING THE MULTIDIMENSIONAL ARRAY Dat1: 2 nd iteration (3 rd DO loop): ALL_G [I,J] G [J] data dat2 (drop = i j g1 - g3); set dat1; by id; array all_g [ 2 , 3 ] $ m_g1 - m_g3 f_g1 - f_g3; array g[ 3 ]; retain all_g; if first.id then i = 0 ; i + 1 ; do j = 1 to 3 ; all_g[i,j] = g[j]; end ; if last.id; run ; B A A B G2 C C 2 4 D B 2 3 C B 1 2 F A 1 1 G3 G1 ID 2 I D B G1 D A G2 D C G3 D 1 ID K 1 LAST.ID D 3 0 2 D J D FIRST.ID D _N_ A F_G2 K C F_G3 K B F_G1 K F M_G3 K B A K M_G2 K M_G1 ALL_G [2,1] ALL_G [2,2] ALL_G [2,3] ALL_G [1,3] ALL_G [1,2] ALL_G [1,1] G[3] G[2] G[1] F_G3 F_G2 F_G1 2 1 M_G3 M_G2 M_G1 3 2 1 G3 G2 G1
151. RESTRUCTURING DATASETS BY USING THE MULTIDIMENSIONAL ARRAY Dat1: 2 nd iteration (4 th DO loop): ALL_G [I,J] G [J] data dat2 (drop = i j g1 - g3); set dat1; by id; array all_g [ 2 , 3 ] $ m_g1 - m_g3 f_g1 - f_g3; array g[ 3 ]; retain all_g; if first.id then i = 0 ; i + 1 ; do j = 1 to 3 ; all_g[i,j] = g[j]; end ; if last.id; run ; B A A B G2 C C 2 4 D B 2 3 C B 1 2 F A 1 1 G3 G1 ID 2 I D B G1 D A G2 D C G3 D 1 ID K 1 LAST.ID D 4 0 2 D J D FIRST.ID D _N_ A F_G2 K C F_G3 K B F_G1 K F M_G3 K B A K M_G2 K M_G1 ALL_G [2,1] ALL_G [2,2] ALL_G [2,3] ALL_G [1,3] ALL_G [1,2] ALL_G [1,1] G[3] G[2] G[1] F_G3 F_G2 F_G1 2 1 M_G3 M_G2 M_G1 3 2 1 G3 G2 G1
152. RESTRUCTURING DATASETS BY USING THE MULTIDIMENSIONAL ARRAY Dat1: 2 nd iteration: ALL_G [I,J] G [J] data dat2 (drop = i j g1 - g3); set dat1; by id; array all_g [ 2 , 3 ] $ m_g1 - m_g3 f_g1 - f_g3; array g[ 3 ]; retain all_g; if first.id then i = 0 ; i + 1 ; do j = 1 to 3 ; all_g[i,j] = g[j]; end ; if last.id; run ; B A A B G2 C C 2 4 D B 2 3 C B 1 2 F A 1 1 G3 G1 ID 2 I D B G1 D A G2 D C G3 D 1 ID K 1 LAST.ID D 4 0 2 D J D FIRST.ID D _N_ A F_G2 K C F_G3 K B F_G1 K F M_G3 K B A K M_G2 K M_G1 ALL_G [2,1] ALL_G [2,2] ALL_G [2,3] ALL_G [1,3] ALL_G [1,2] ALL_G [1,1] G[3] G[2] G[1] F_G3 F_G2 F_G1 2 1 M_G3 M_G2 M_G1 3 2 1 G3 G2 G1
153. RESTRUCTURING DATASETS BY USING THE MULTIDIMENSIONAL ARRAY Dat1: 2 nd iteration: ALL_G [I,J] G [J] data dat2 (drop = i j g1 - g3); set dat1; by id; array all_g [ 2 , 3 ] $ m_g1 - m_g3 f_g1 - f_g3; array g[ 3 ]; retain all_g; if first.id then i = 0 ; i + 1 ; do j = 1 to 3 ; all_g[i,j] = g[j]; end ; if last.id; run ; B A A B G2 C C 2 4 D B 2 3 C B 1 2 F A 1 1 G3 G1 ID 2 I D B G1 D A G2 D C G3 D 1 ID K 1 LAST.ID D 4 0 2 D J D FIRST.ID D _N_ A F_G2 K C F_G3 K B F_G1 K F M_G3 K B A K M_G2 K M_G1 ALL_G [2,1] ALL_G [2,2] ALL_G [2,3] ALL_G [1,3] ALL_G [1,2] ALL_G [1,1] G[3] G[2] G[1] F_G3 F_G2 F_G1 2 1 M_G3 M_G2 M_G1 3 2 1 G3 G2 G1
154. RESTRUCTURING DATASETS BY USING THE MULTIDIMENSIONAL ARRAY data dat2 (drop = i j g1 - g3); set dat1; by id; array all_g [ 2 , 3 ] $ m_g1 - m_g3 f_g1 - f_g3; array g[ 3 ]; retain all_g; if first.id then i = 0 ; i + 1 ; do j = 1 to 3 ; all_g[i,j] = g[j]; end ; if last.id; run ; Dat1: 2 nd iteration: ALL_G [I,J] G [J] Dat2: B A A B G2 C C 2 4 D B 2 3 C B 1 2 F A 1 1 G3 G1 ID 2 I D B G1 D A G2 D C G3 D 1 ID K 1 LAST.ID D 4 0 2 D J D FIRST.ID D _N_ A F_G2 K C F_G3 K B F_G1 K F M_G3 K B A K M_G2 K M_G1 ALL_G [2,1] ALL_G [2,2] ALL_G [2,3] ALL_G [1,3] ALL_G [1,2] ALL_G [1,1] G[3] G[2] G[1] F_G3 F_G2 F_G1 2 1 M_G3 M_G2 M_G1 3 2 1 G3 G2 G1 C F_G3 B F_G1 F M_G3 B M_G2 A A 1 1 F_G2 M_G1 ID
155. RESTRUCTURING DATASETS BY USING THE MULTIDIMENSIONAL ARRAY data dat2 (drop = i j g1 - g3); set dat1; by id; array all_g [ 2 , 3 ] $ m_g1 - m_g3 f_g1 - f_g3; array g[ 3 ]; retain all_g; if first.id then i = 0 ; i + 1 ; do j = 1 to 3 ; all_g[i,j] = g[j]; end ; if last.id; run ; Dat1: 3 rd iteration: Dat2: ALL_G [I,J] G [J] B A A B G2 C C 2 4 D B 2 3 C B 1 2 F A 1 1 G3 G1 ID 2 I D B G1 D A G2 D C G3 D 1 ID K 1 LAST.ID D . 0 3 D J D FIRST.ID D _N_ A F_G2 K C F_G3 K B F_G1 K F M_G3 K B A K M_G2 K M_G1 ALL_G [2,1] ALL_G [2,2] ALL_G [2,3] ALL_G [1,3] ALL_G [1,2] ALL_G [1,1] G[3] G[2] G[1] F_G3 F_G2 F_G1 2 1 M_G3 M_G2 M_G1 3 2 1 G3 G2 G1 C F_G3 B F_G1 F M_G3 B M_G2 A A 1 1 F_G2 M_G1 ID
156. RESTRUCTURING DATASETS BY USING THE MULTIDIMENSIONAL ARRAY data dat2 (drop = i j g1 - g3); set dat1; by id; array all_g [ 2 , 3 ] $ m_g1 - m_g3 f_g1 - f_g3; array g[ 3 ]; retain all_g; if first.id then i = 0 ; i + 1 ; do j = 1 to 3 ; all_g[i,j] = g[j]; end ; if last.id; run ; Dat1: 3 rd iteration: Dat2: ALL_G [I,J] G [J] B A A B G2 C C 2 4 D B 2 3 C B 1 2 F A 1 1 G3 G1 ID 2 I D B G1 D A G2 D D G3 D 2 ID K 0 LAST.ID D . 1 3 D J D FIRST.ID D _N_ A F_G2 K C F_G3 K B F_G1 K F M_G3 K B A K M_G2 K M_G1 ALL_G [2,1] ALL_G [2,2] ALL_G [2,3] ALL_G [1,3] ALL_G [1,2] ALL_G [1,1] G[3] G[2] G[1] F_G3 F_G2 F_G1 2 1 M_G3 M_G2 M_G1 3 2 1 G3 G2 G1 C F_G3 B F_G1 F M_G3 B M_G2 A A 1 1 F_G2 M_G1 ID
157. RESTRUCTURING DATASETS BY USING THE MULTIDIMENSIONAL ARRAY data dat2 (drop = i j g1 - g3); set dat1; by id; array all_g [ 2 , 3 ] $ m_g1 - m_g3 f_g1 - f_g3; array g[ 3 ]; retain all_g; if first.id then i = 0 ; i + 1 ; do j = 1 to 3 ; all_g[i,j] = g[j]; end ; if last.id; run ; Dat1: 3 rd iteration: Dat2: ALL_G [I,J] G [J] B A A B G2 C C 2 4 D B 2 3 C B 1 2 F A 1 1 G3 G1 ID 0 I D B G1 D A G2 D D G3 D 2 ID K 0 LAST.ID D . 1 3 D J D FIRST.ID D _N_ A F_G2 K C F_G3 K B F_G1 K F M_G3 K B A K M_G2 K M_G1 ALL_G [2,1] ALL_G [2,2] ALL_G [2,3] ALL_G [1,3] ALL_G [1,2] ALL_G [1,1] G[3] G[2] G[1] F_G3 F_G2 F_G1 2 1 M_G3 M_G2 M_G1 3 2 1 G3 G2 G1 C F_G3 B F_G1 F M_G3 B M_G2 A A 1 1 F_G2 M_G1 ID
158. RESTRUCTURING DATASETS BY USING THE MULTIDIMENSIONAL ARRAY data dat2 (drop = i j g1 - g3); set dat1; by id; array all_g [ 2 , 3 ] $ m_g1 - m_g3 f_g1 - f_g3; array g[ 3 ]; retain all_g; if first.id then i = 0 ; i + 1 ; do j = 1 to 3 ; all_g[i,j] = g[j]; end ; if last.id; run ; Dat1: 3 rd iteration: Dat2: ALL_G [I,J] G [J] B A A B G2 C C 2 4 D B 2 3 C B 1 2 F A 1 1 G3 G1 ID 1 I D B G1 D A G2 D D G3 D 2 ID K 0 LAST.ID D . 1 3 D J D FIRST.ID D _N_ A F_G2 K C F_G3 K B F_G1 K F M_G3 K B A K M_G2 K M_G1 ALL_G [2,1] ALL_G [2,2] ALL_G [2,3] ALL_G [1,3] ALL_G [1,2] ALL_G [1,1] G[3] G[2] G[1] F_G3 F_G2 F_G1 2 1 M_G3 M_G2 M_G1 3 2 1 G3 G2 G1 C F_G3 B F_G1 F M_G3 B M_G2 A A 1 1 F_G2 M_G1 ID
159. RESTRUCTURING DATASETS BY USING THE MULTIDIMENSIONAL ARRAY data dat2 (drop = i j g1 - g3); set dat1; by id; array all_g [ 2 , 3 ] $ m_g1 - m_g3 f_g1 - f_g3; array g[ 3 ]; retain all_g; if first.id then i = 0 ; i + 1 ; do j = 1 to 3 ; all_g[i,j] = g[j]; end ; if last.id; run ; Dat1: 3 rd iteration (1 st DO loop): Dat2: ALL_G [I,J] G [J] B A A B G2 C C 2 4 D B 2 3 C B 1 2 F A 1 1 G3 G1 ID 1 I D B G1 D A G2 D D G3 D 2 ID K 0 LAST.ID D 1 1 3 D J D FIRST.ID D _N_ A F_G2 K C F_G3 K B F_G1 K F M_G3 K B A K M_G2 K M_G1 ALL_G [2,1] ALL_G [2,2] ALL_G [2,3] ALL_G [1,3] ALL_G [1,2] ALL_G [1,1] G[3] G[2] G[1] F_G3 F_G2 F_G1 2 1 M_G3 M_G2 M_G1 3 2 1 G3 G2 G1 C F_G3 B F_G1 F M_G3 B M_G2 A A 1 1 F_G2 M_G1 ID
160. RESTRUCTURING DATASETS BY USING THE MULTIDIMENSIONAL ARRAY data dat2 (drop = i j g1 - g3); set dat1; by id; array all_g [ 2 , 3 ] $ m_g1 - m_g3 f_g1 - f_g3; array g[ 3 ]; retain all_g; if first.id then i = 0 ; i + 1 ; do j = 1 to 3 ; all_g[i,j] = g[j]; end ; if last.id; run ; Dat1: 3 rd iteration (1 st DO loop): Dat2: ALL_G [I,J] G [J] B A A B G2 C C 2 4 D B 2 3 C B 1 2 F A 1 1 G3 G1 ID 1 I D B G1 D A G2 D D G3 D 2 ID K 0 LAST.ID D 1 1 3 D J D FIRST.ID D _N_ A F_G2 K C F_G3 K B F_G1 K F M_G3 K B B K M_G2 K M_G1 ALL_G [2,1] ALL_G [2,2] ALL_G [2,3] ALL_G [1,3] ALL_G [1,2] ALL_G [1,1] G[3] G[2] G[1] F_G3 F_G2 F_G1 2 1 M_G3 M_G2 M_G1 3 2 1 G3 G2 G1 C F_G3 B F_G1 F M_G3 B M_G2 A A 1 1 F_G2 M_G1 ID
161. RESTRUCTURING DATASETS BY USING THE MULTIDIMENSIONAL ARRAY data dat2 (drop = i j g1 - g3); set dat1; by id; array all_g [ 2 , 3 ] $ m_g1 - m_g3 f_g1 - f_g3; array g[ 3 ]; retain all_g; if first.id then i = 0 ; i + 1 ; do j = 1 to 3 ; all_g[i,j] = g[j]; end ; if last.id; run ; Dat1: 3 rd iteration (1 st DO loop): Dat2: ALL_G [I,J] G [J] B A A B G2 C C 2 4 D B 2 3 C B 1 2 F A 1 1 G3 G1 ID 1 I D B G1 D A G2 D D G3 D 2 ID K 0 LAST.ID D 1 1 3 D J D FIRST.ID D _N_ A F_G2 K C F_G3 K B F_G1 K F M_G3 K B B K M_G2 K M_G1 ALL_G [2,1] ALL_G [2,2] ALL_G [2,3] ALL_G [1,3] ALL_G [1,2] ALL_G [1,1] G[3] G[2] G[1] F_G3 F_G2 F_G1 2 1 M_G3 M_G2 M_G1 3 2 1 G3 G2 G1 C F_G3 B F_G1 F M_G3 B M_G2 A A 1 1 F_G2 M_G1 ID
162. RESTRUCTURING DATASETS BY USING THE MULTIDIMENSIONAL ARRAY data dat2 (drop = i j g1 - g3); set dat1; by id; array all_g [ 2 , 3 ] $ m_g1 - m_g3 f_g1 - f_g3; array g[ 3 ]; retain all_g; if first.id then i = 0 ; i + 1 ; do j = 1 to 3 ; all_g[i,j] = g[j]; end ; if last.id; run ; Dat1: 3 rd iteration (2 nd DO loop): Dat2: ALL_G [I,J] G [J] B A A B G2 C C 2 4 D B 2 3 C B 1 2 F A 1 1 G3 G1 ID 1 I D B G1 D A G2 D D G3 D 2 ID K 0 LAST.ID D 2 1 3 D J D FIRST.ID D _N_ A F_G2 K C F_G3 K B F_G1 K F M_G3 K B B K M_G2 K M_G1 ALL_G [2,1] ALL_G [2,2] ALL_G [2,3] ALL_G [1,3] ALL_G [1,2] ALL_G [1,1] G[3] G[2] G[1] F_G3 F_G2 F_G1 2 1 M_G3 M_G2 M_G1 3 2 1 G3 G2 G1 C F_G3 B F_G1 F M_G3 B M_G2 A A 1 1 F_G2 M_G1 ID
163. RESTRUCTURING DATASETS BY USING THE MULTIDIMENSIONAL ARRAY data dat2 (drop = i j g1 - g3); set dat1; by id; array all_g [ 2 , 3 ] $ m_g1 - m_g3 f_g1 - f_g3; array g[ 3 ]; retain all_g; if first.id then i = 0 ; i + 1 ; do j = 1 to 3 ; all_g[i,j] = g[j]; end ; if last.id; run ; Dat1: 3 rd iteration (2 nd DO loop): Dat2: ALL_G [I,J] G [J] B A A B G2 C C 2 4 D B 2 3 C B 1 2 F A 1 1 G3 G1 ID 1 I D B G1 D A G2 D D G3 D 2 ID K 0 LAST.ID D 2 1 3 D J D FIRST.ID D _N_ A F_G2 K C F_G3 K B F_G1 K F M_G3 K A B K M_G2 K M_G1 ALL_G [2,1] ALL_G [2,2] ALL_G [2,3] ALL_G [1,3] ALL_G [1,2] ALL_G [1,1] G[3] G[2] G[1] F_G3 F_G2 F_G1 2 1 M_G3 M_G2 M_G1 3 2 1 G3 G2 G1 C F_G3 B F_G1 F M_G3 B M_G2 A A 1 1 F_G2 M_G1 ID
164. RESTRUCTURING DATASETS BY USING THE MULTIDIMENSIONAL ARRAY data dat2 (drop = i j g1 - g3); set dat1; by id; array all_g [ 2 , 3 ] $ m_g1 - m_g3 f_g1 - f_g3; array g[ 3 ]; retain all_g; if first.id then i = 0 ; i + 1 ; do j = 1 to 3 ; all_g[i,j] = g[j]; end ; if last.id; run ; Dat1: 3 rd iteration (2 nd DO loop): Dat2: ALL_G [I,J] G [J] B A A B G2 C C 2 4 D B 2 3 C B 1 2 F A 1 1 G3 G1 ID 1 I D B G1 D A G2 D D G3 D 2 ID K 0 LAST.ID D 2 1 3 D J D FIRST.ID D _N_ A F_G2 K C F_G3 K B F_G1 K F M_G3 K A B K M_G2 K M_G1 ALL_G [2,1] ALL_G [2,2] ALL_G [2,3] ALL_G [1,3] ALL_G [1,2] ALL_G [1,1] G[3] G[2] G[1] F_G3 F_G2 F_G1 2 1 M_G3 M_G2 M_G1 3 2 1 G3 G2 G1 C F_G3 B F_G1 F M_G3 B M_G2 A A 1 1 F_G2 M_G1 ID
165. RESTRUCTURING DATASETS BY USING THE MULTIDIMENSIONAL ARRAY data dat2 (drop = i j g1 - g3); set dat1; by id; array all_g [ 2 , 3 ] $ m_g1 - m_g3 f_g1 - f_g3; array g[ 3 ]; retain all_g; if first.id then i = 0 ; i + 1 ; do j = 1 to 3 ; all_g[i,j] = g[j]; end ; if last.id; run ; Dat1: 3 rd iteration (3 rd DO loop): Dat2: ALL_G [I,J] G [J] B A A B G2 C C 2 4 D B 2 3 C B 1 2 F A 1 1 G3 G1 ID 1 I D B G1 D A G2 D D G3 D 2 ID K 0 LAST.ID D 3 1 3 D J D FIRST.ID D _N_ A F_G2 K C F_G3 K B F_G1 K F M_G3 K A B K M_G2 K M_G1 ALL_G [2,1] ALL_G [2,2] ALL_G [2,3] ALL_G [1,3] ALL_G [1,2] ALL_G [1,1] G[3] G[2] G[1] F_G3 F_G2 F_G1 2 1 M_G3 M_G2 M_G1 3 2 1 G3 G2 G1 C F_G3 B F_G1 F M_G3 B M_G2 A A 1 1 F_G2 M_G1 ID
166. RESTRUCTURING DATASETS BY USING THE MULTIDIMENSIONAL ARRAY data dat2 (drop = i j g1 - g3); set dat1; by id; array all_g [ 2 , 3 ] $ m_g1 - m_g3 f_g1 - f_g3; array g[ 3 ]; retain all_g; if first.id then i = 0 ; i + 1 ; do j = 1 to 3 ; all_g[i,j] = g[j]; end ; if last.id; run ; Dat1: 3 rd iteration (3 rd DO loop): Dat2: ALL_G [I,J] G [J] B A A B G2 C C 2 4 D B 2 3 C B 1 2 F A 1 1 G3 G1 ID 1 I D B G1 D A G2 D D G3 D 2 ID K 0 LAST.ID D 3 1 3 D J D FIRST.ID D _N_ A F_G2 K C F_G3 K B F_G1 K D M_G3 K A B K M_G2 K M_G1 ALL_G [2,1] ALL_G [2,2] ALL_G [2,3] ALL_G [1,3] ALL_G [1,2] ALL_G [1,1] G[3] G[2] G[1] F_G3 F_G2 F_G1 2 1 M_G3 M_G2 M_G1 3 2 1 G3 G2 G1 C F_G3 B F_G1 F M_G3 B M_G2 A A 1 1 F_G2 M_G1 ID
167. RESTRUCTURING DATASETS BY USING THE MULTIDIMENSIONAL ARRAY data dat2 (drop = i j g1 - g3); set dat1; by id; array all_g [ 2 , 3 ] $ m_g1 - m_g3 f_g1 - f_g3; array g[ 3 ]; retain all_g; if first.id then i = 0 ; i + 1 ; do j = 1 to 3 ; all_g[i,j] = g[j]; end ; if last.id; run ; Dat1: 3 rd iteration (3 rd DO loop): Dat2: ALL_G [I,J] G [J] B A A B G2 C C 2 4 D B 2 3 C B 1 2 F A 1 1 G3 G1 ID 1 I D B G1 D A G2 D D G3 D 2 ID K 0 LAST.ID D 3 1 3 D J D FIRST.ID D _N_ A F_G2 K C F_G3 K B F_G1 K D M_G3 K A B K M_G2 K M_G1 ALL_G [2,1] ALL_G [2,2] ALL_G [2,3] ALL_G [1,3] ALL_G [1,2] ALL_G [1,1] G[3] G[2] G[1] F_G3 F_G2 F_G1 2 1 M_G3 M_G2 M_G1 3 2 1 G3 G2 G1 C F_G3 B F_G1 F M_G3 B M_G2 A A 1 1 F_G2 M_G1 ID
168. RESTRUCTURING DATASETS BY USING THE MULTIDIMENSIONAL ARRAY data dat2 (drop = i j g1 - g3); set dat1; by id; array all_g [ 2 , 3 ] $ m_g1 - m_g3 f_g1 - f_g3; array g[ 3 ]; retain all_g; if first.id then i = 0 ; i + 1 ; do j = 1 to 3 ; all_g[i,j] = g[j]; end ; if last.id; run ; Dat1: 3 rd iteration (4 th DO loop): Dat2: ALL_G [I,J] G [J] B A A B G2 C C 2 4 D B 2 3 C B 1 2 F A 1 1 G3 G1 ID 1 I D B G1 D A G2 D D G3 D 2 ID K 0 LAST.ID D 4 1 3 D J D FIRST.ID D _N_ A F_G2 K C F_G3 K B F_G1 K D M_G3 K A B K M_G2 K M_G1 ALL_G [2,1] ALL_G [2,2] ALL_G [2,3] ALL_G [1,3] ALL_G [1,2] ALL_G [1,1] G[3] G[2] G[1] F_G3 F_G2 F_G1 2 1 M_G3 M_G2 M_G1 3 2 1 G3 G2 G1 C F_G3 B F_G1 F M_G3 B M_G2 A A 1 1 F_G2 M_G1 ID
169. RESTRUCTURING DATASETS BY USING THE MULTIDIMENSIONAL ARRAY data dat2 (drop = i j g1 - g3); set dat1; by id; array all_g [ 2 , 3 ] $ m_g1 - m_g3 f_g1 - f_g3; array g[ 3 ]; retain all_g; if first.id then i = 0 ; i + 1 ; do j = 1 to 3 ; all_g[i,j] = g[j]; end ; if last.id; run ; Dat1: 3 rd iteration: Dat2: ALL_G [I,J] G [J] B A A B G2 C C 2 4 D B 2 3 C B 1 2 F A 1 1 G3 G1 ID 1 I D B G1 D A G2 D D G3 D 2 ID K 0 LAST.ID D 4 1 3 D J D FIRST.ID D _N_ A F_G2 K C F_G3 K B F_G1 K D M_G3 K A B K M_G2 K M_G1 ALL_G [2,1] ALL_G [2,2] ALL_G [2,3] ALL_G [1,3] ALL_G [1,2] ALL_G [1,1] G[3] G[2] G[1] F_G3 F_G2 F_G1 2 1 M_G3 M_G2 M_G1 3 2 1 G3 G2 G1 C F_G3 B F_G1 F M_G3 B M_G2 A A 1 1 F_G2 M_G1 ID
170. RESTRUCTURING DATASETS BY USING THE MULTIDIMENSIONAL ARRAY data dat2 (drop = i j g1 - g3); set dat1; by id; array all_g [ 2 , 3 ] $ m_g1 - m_g3 f_g1 - f_g3; array g[ 3 ]; retain all_g; if first.id then i = 0 ; i + 1 ; do j = 1 to 3 ; all_g[i,j] = g[j]; end ; if last.id; run ; Dat1: 4 th iteration: Dat2: ALL_G [I,J] G [J] B A A B G2 C C 2 4 D B 2 3 C B 1 2 F A 1 1 G3 G1 ID 1 I D B G1 D A G2 D D G3 D 2 ID K 0 LAST.ID D . 1 4 D J D FIRST.ID D _N_ A F_G2 K C F_G3 K B F_G1 K D M_G3 K A B K M_G2 K M_G1 ALL_G [2,1] ALL_G [2,2] ALL_G [2,3] ALL_G [1,3] ALL_G [1,2] ALL_G [1,1] G[3] G[2] G[1] F_G3 F_G2 F_G1 2 1 M_G3 M_G2 M_G1 3 2 1 G3 G2 G1 C F_G3 B F_G1 F M_G3 B M_G2 A A 1 1 F_G2 M_G1 ID
171. RESTRUCTURING DATASETS BY USING THE MULTIDIMENSIONAL ARRAY data dat2 (drop = i j g1 - g3); set dat1; by id; array all_g [ 2 , 3 ] $ m_g1 - m_g3 f_g1 - f_g3; array g[ 3 ]; retain all_g; if first.id then i = 0 ; i + 1 ; do j = 1 to 3 ; all_g[i,j] = g[j]; end ; if last.id; run ; Dat1: 4 th iteration: Dat2: ALL_G [I,J] G [J] B A A B G2 C C 2 4 D B 2 3 C B 1 2 F A 1 1 G3 G1 ID 1 I D C G1 D B G2 D C G3 D 2 ID K 1 LAST.ID D . 0 4 D J D FIRST.ID D _N_ A F_G2 K C F_G3 K B F_G1 K D M_G3 K A B K M_G2 K M_G1 ALL_G [2,1] ALL_G [2,2] ALL_G [2,3] ALL_G [1,3] ALL_G [1,2] ALL_G [1,1] G[3] G[2] G[1] F_G3 F_G2 F_G1 2 1 M_G3 M_G2 M_G1 3 2 1 G3 G2 G1 C F_G3 B F_G1 F M_G3 B M_G2 A A 1 1 F_G2 M_G1 ID
172. RESTRUCTURING DATASETS BY USING THE MULTIDIMENSIONAL ARRAY data dat2 (drop = i j g1 - g3); set dat1; by id; array all_g [ 2 , 3 ] $ m_g1 - m_g3 f_g1 - f_g3; array g[ 3 ]; retain all_g; if first.id then i = 0 ; i + 1 ; do j = 1 to 3 ; all_g[i,j] = g[j]; end ; if last.id; run ; Dat1: 4 th iteration: Dat2: ALL_G [I,J] G [J] B A A B G2 C C 2 4 D B 2 3 C B 1 2 F A 1 1 G3 G1 ID 1 I D C G1 D B G2 D C G3 D 2 ID K 1 LAST.ID D . 0 4 D J D FIRST.ID D _N_ A F_G2 K C F_G3 K B F_G1 K D M_G3 K A B K M_G2 K M_G1 ALL_G [2,1] ALL_G [2,2] ALL_G [2,3] ALL_G [1,3] ALL_G [1,2] ALL_G [1,1] G[3] G[2] G[1] F_G3 F_G2 F_G1 2 1 M_G3 M_G2 M_G1 3 2 1 G3 G2 G1 C F_G3 B F_G1 F M_G3 B M_G2 A A 1 1 F_G2 M_G1 ID
173. RESTRUCTURING DATASETS BY USING THE MULTIDIMENSIONAL ARRAY data dat2 (drop = i j g1 - g3); set dat1; by id; array all_g [ 2 , 3 ] $ m_g1 - m_g3 f_g1 - f_g3; array g[ 3 ]; retain all_g; if first.id then i = 0 ; i + 1 ; do j = 1 to 3 ; all_g[i,j] = g[j]; end ; if last.id; run ; Dat1: 4 th iteration: Dat2: ALL_G [I,J] G [J] B A A B G2 C C 2 4 D B 2 3 C B 1 2 F A 1 1 G3 G1 ID 2 I D C G1 D B G2 D C G3 D 2 ID K 1 LAST.ID D . 0 4 D J D FIRST.ID D _N_ A F_G2 K C F_G3 K B F_G1 K D M_G3 K A B K M_G2 K M_G1 ALL_G [2,1] ALL_G [2,2] ALL_G [2,3] ALL_G [1,3] ALL_G [1,2] ALL_G [1,1] G[3] G[2] G[1] F_G3 F_G2 F_G1 2 1 M_G3 M_G2 M_G1 3 2 1 G3 G2 G1 C F_G3 B F_G1 F M_G3 B M_G2 A A 1 1 F_G2 M_G1 ID
174. RESTRUCTURING DATASETS BY USING THE MULTIDIMENSIONAL ARRAY data dat2 (drop = i j g1 - g3); set dat1; by id; array all_g [ 2 , 3 ] $ m_g1 - m_g3 f_g1 - f_g3; array g[ 3 ]; retain all_g; if first.id then i = 0 ; i + 1 ; do j = 1 to 3 ; all_g[i,j] = g[j]; end ; if last.id; run ; Dat1: 4 th iteration (1 st DO loop): Dat2: ALL_G [I,J] G [J] B A A B G2 C C 2 4 D B 2 3 C B 1 2 F A 1 1 G3 G1 ID 2 I D C G1 D B G2 D C G3 D 2 ID K 1 LAST.ID D 1 0 4 D J D FIRST.ID D _N_ A F_G2 K C F_G3 K B F_G1 K D M_G3 K A B K M_G2 K M_G1 ALL_G [2,1] ALL_G [2,2] ALL_G [2,3] ALL_G [1,3] ALL_G [1,2] ALL_G [1,1] G[3] G[2] G[1] F_G3 F_G2 F_G1 2 1 M_G3 M_G2 M_G1 3 2 1 G3 G2 G1 C F_G3 B F_G1 F M_G3 B M_G2 A A 1 1 F_G2 M_G1 ID
175. RESTRUCTURING DATASETS BY USING THE MULTIDIMENSIONAL ARRAY data dat2 (drop = i j g1 - g3); set dat1; by id; array all_g [ 2 , 3 ] $ m_g1 - m_g3 f_g1 - f_g3; array g[ 3 ]; retain all_g; if first.id then i = 0 ; i + 1 ; do j = 1 to 3 ; all_g[i,j] = g[j]; end ; if last.id; run ; Dat1: 4 th iteration (1 st DO loop): Dat2: ALL_G [I,J] G [J] B A A B G2 C C 2 4 D B 2 3 C B 1 2 F A 1 1 G3 G1 ID 2 I D C G1 D B G2 D C G3 D 2 ID K 1 LAST.ID D 1 0 4 D J D FIRST.ID D _N_ A F_G2 K C F_G3 K C F_G1 K D M_G3 K A B K M_G2 K M_G1 ALL_G [2,1] ALL_G [2,2] ALL_G [2,3] ALL_G [1,3] ALL_G [1,2] ALL_G [1,1] G[3] G[2] G[1] F_G3 F_G2 F_G1 2 1 M_G3 M_G2 M_G1 3 2 1 G3 G2 G1 C F_G3 B F_G1 F M_G3 B M_G2 A A 1 1 F_G2 M_G1 ID
176. RESTRUCTURING DATASETS BY USING THE MULTIDIMENSIONAL ARRAY data dat2 (drop = i j g1 - g3); set dat1; by id; array all_g [ 2 , 3 ] $ m_g1 - m_g3 f_g1 - f_g3; array g[ 3 ]; retain all_g; if first.id then i = 0 ; i + 1 ; do j = 1 to 3 ; all_g[i,j] = g[j]; end ; if last.id; run ; Dat1: 4 th iteration (1 st DO loop): Dat2: ALL_G [I,J] G [J] B A A B G2 C C 2 4 D B 2 3 C B 1 2 F A 1 1 G3 G1 ID 2 I D C G1 D B G2 D C G3 D 2 ID K 1 LAST.ID D 1 0 4 D J D FIRST.ID D _N_ A F_G2 K C F_G3 K C F_G1 K D M_G3 K A B K M_G2 K M_G1 ALL_G [2,1] ALL_G [2,2] ALL_G [2,3] ALL_G [1,3] ALL_G [1,2] ALL_G [1,1] G[3] G[2] G[1] F_G3 F_G2 F_G1 2 1 M_G3 M_G2 M_G1 3 2 1 G3 G2 G1 C F_G3 B F_G1 F M_G3 B M_G2 A A 1 1 F_G2 M_G1 ID
177. RESTRUCTURING DATASETS BY USING THE MULTIDIMENSIONAL ARRAY data dat2 (drop = i j g1 - g3); set dat1; by id; array all_g [ 2 , 3 ] $ m_g1 - m_g3 f_g1 - f_g3; array g[ 3 ]; retain all_g; if first.id then i = 0 ; i + 1 ; do j = 1 to 3 ; all_g[i,j] = g[j]; end ; if last.id; run ; Dat1: 4 th iteration (2 nd DO loop): Dat2: ALL_G [I,J] G [J] B A A B G2 C C 2 4 D B 2 3 C B 1 2 F A 1 1 G3 G1 ID 2 I D C G1 D B G2 D C G3 D 2 ID K 1 LAST.ID D 2 0 4 D J D FIRST.ID D _N_ A F_G2 K C F_G3 K C F_G1 K D M_G3 K A B K M_G2 K M_G1 ALL_G [2,1] ALL_G [2,2] ALL_G [2,3] ALL_G [1,3] ALL_G [1,2] ALL_G [1,1] G[3] G[2] G[1] F_G3 F_G2 F_G1 2 1 M_G3 M_G2 M_G1 3 2 1 G3 G2 G1 C F_G3 B F_G1 F M_G3 B M_G2 A A 1 1 F_G2 M_G1 ID
178. RESTRUCTURING DATASETS BY USING THE MULTIDIMENSIONAL ARRAY data dat2 (drop = i j g1 - g3); set dat1; by id; array all_g [ 2 , 3 ] $ m_g1 - m_g3 f_g1 - f_g3; array g[ 3 ]; retain all_g; if first.id then i = 0 ; i + 1 ; do j = 1 to 3 ; all_g[i,j] = g[j]; end ; if last.id; run ; Dat1: 4 th iteration (2 nd DO loop): Dat2: ALL_G [I,J] G [J] B A A B G2 C C 2 4 D B 2 3 C B 1 2 F A 1 1 G3 G1 ID 2 I D C G1 D B G2 D C G3 D 2 ID K 1 LAST.ID D 2 0 4 D J D FIRST.ID D _N_ B F_G2 K C F_G3 K C F_G1 K D M_G3 K A B K M_G2 K M_G1 ALL_G [2,1] ALL_G [2,2] ALL_G [2,3] ALL_G [1,3] ALL_G [1,2] ALL_G [1,1] G[3] G[2] G[1] F_G3 F_G2 F_G1 2 1 M_G3 M_G2 M_G1 3 2 1 G3 G2 G1 C F_G3 B F_G1 F M_G3 B M_G2 A A 1 1 F_G2 M_G1 ID
179. RESTRUCTURING DATASETS BY USING THE MULTIDIMENSIONAL ARRAY data dat2 (drop = i j g1 - g3); set dat1; by id; array all_g [ 2 , 3 ] $ m_g1 - m_g3 f_g1 - f_g3; array g[ 3 ]; retain all_g; if first.id then i = 0 ; i + 1 ; do j = 1 to 3 ; all_g[i,j] = g[j]; end ; if last.id; run ; Dat1: 4 th iteration (2 nd DO loop): Dat2: ALL_G [I,J] G [J] B A A B G2 C C 2 4 D B 2 3 C B 1 2 F A 1 1 G3 G1 ID 2 I D C G1 D B G2 D C G3 D 2 ID K 1 LAST.ID D 2 0 4 D J D FIRST.ID D _N_ B F_G2 K C F_G3 K C F_G1 K D M_G3 K A B K M_G2 K M_G1 ALL_G [2,1] ALL_G [2,2] ALL_G [2,3] ALL_G [1,3] ALL_G [1,2] ALL_G [1,1] G[3] G[2] G[1] F_G3 F_G2 F_G1 2 1 M_G3 M_G2 M_G1 3 2 1 G3 G2 G1 C F_G3 B F_G1 F M_G3 B M_G2 A A 1 1 F_G2 M_G1 ID
180. RESTRUCTURING DATASETS BY USING THE MULTIDIMENSIONAL ARRAY data dat2 (drop = i j g1 - g3); set dat1; by id; array all_g [ 2 , 3 ] $ m_g1 - m_g3 f_g1 - f_g3; array g[ 3 ]; retain all_g; if first.id then i = 0 ; i + 1 ; do j = 1 to 3 ; all_g[i,j] = g[j]; end ; if last.id; run ; Dat1: 4 th iteration (3 rd DO loop): Dat2: ALL_G [I,J] G [J] B A A B G2 C C 2 4 D B 2 3 C B 1 2 F A 1 1 G3 G1 ID 2 I D C G1 D B G2 D C G3 D 2 ID K 1 LAST.ID D 3 0 4 D J D FIRST.ID D _N_ B F_G2 K C F_G3 K C F_G1 K D M_G3 K A B K M_G2 K M_G1 ALL_G [2,1] ALL_G [2,2] ALL_G [2,3] ALL_G [1,3] ALL_G [1,2] ALL_G [1,1] G[3] G[2] G[1] F_G3 F_G2 F_G1 2 1 M_G3 M_G2 M_G1 3 2 1 G3 G2 G1 C F_G3 B F_G1 F M_G3 B M_G2 A A 1 1 F_G2 M_G1 ID
181. RESTRUCTURING DATASETS BY USING THE MULTIDIMENSIONAL ARRAY data dat2 (drop = i j g1 - g3); set dat1; by id; array all_g [ 2 , 3 ] $ m_g1 - m_g3 f_g1 - f_g3; array g[ 3 ]; retain all_g; if first.id then i =