title: array processing with different indices and missing values in SAS
body: <p><code>have</code> is a sas data set with 4 variables: an <code>id</code> and variables storing info on all the activities a respondent shares with 3 different members of a team they're on. There are 4 different activity types, identified by the numbers populating in the <code>:_activities</code> vars for each player (p1 to p3). Below are the first 5 obs:</p>
  
  <pre><code>id  p1_activities   p2_activities   p3_activities
  A   1,2,3,4         1,3 
  B   1,3             1,2,3           1,2,3
  C                   1,2,3           1,2,3
  D                   1,2,3   
  E   1,2,3                           1
  </code></pre>
  
  <p>Consider respondent A: they share all 4 activities with player 1 on their team, and activities 1 and 3 with player 2 on their team. I need to create flags for each player position and each activity. For example, a new numeric variable <code>p1_act2_flag</code> should equal <code>1</code> for all respondents who have a value of <code>2</code> appearing in the <code>p1_activities</code> character variable. Here are the first 6 variables I need to create out of the 12 total for the data shown:</p>
  
  <pre><code>p1_act1_flag p1_act2_flag p1_act3_flag p1_act4_flag p2_act1_flag p2_act2_flag …
  1            1            1            1            1            0            …
  1            0            1            0            1            1            …
  .            .            .            .            1            1            …
  .            .            .            .            1            1            …
  1            1            1            0            .            .            …
  </code></pre>
  
  <p>I do this now by initializing all of the variable names in a length statement, then writing a ton if-then statements. I want to use far fewer lines of code, but my array logic is incorrect. Here's how I try to create the flags for player 1:</p>
  
  <pre><code>data want;
  length p1_act1_flg p1_act2_flg p1_act3_flg p1_act4_flg
         p2_act1_flg p2_act2_flg p2_act3_flg p2_act4_flg
         p3_act1_flg p3_act2_flg p3_act3_flg p3_act4_flg
         p4_act1_flg p4_act2_flg p4_act3_flg p4_act4_flg 8.0;
  set have;
  
  array plracts  {*} p1_activities p2_activities p3_activities;
  
  array p1actflg {*} p1_act1_flg p1_act2_flg p1_act3_flg p1_act4_flg;
  array p2actflg {*} p2_act1_flg p2_act2_flg p2_act3_flg p2_act4_flg;
  array p3actflg {*} p3_act1_flg p3_act2_flg p3_act3_flg p3_act4_flg;
  array p4actflg {*} p4_act1_flg p4_act2_flg p4_act3_flg p4_act4_flg;
  
  do i=1 to dim(plracts);
  do j=1 to dim(p1actflg);
  
           if find(plracts{i}, cats(put(j, $12.))) then p1actflg{j}=1;
      else if missing(plracts{i})                  then p1actflg{j}=.;
      else                                              p1actflg{j}=0;
  
  end;
  end;
  
  *do this again for the other p#actflg arrays;
  
  run;
  </code></pre>
  
  <p>My "array subscript is out of range" because of the different lengths of the player and activity arrays, but nesting in different do-loops would result in me writing many more lines of code than a wallpaper solution.</p>
  
  <p>How would you do this more systematically, and/or in far fewer lines of code?</p>