выходное наблюдение, если соответствует критериям - PullRequest
0 голосов
/ 06 января 2012

Вот мой набор данных: Имя Марк Математика Математика2 Математика3 -------------------------------------

Justin  AA1 1   0   1   
Justin  BB1 1   1   1   
Justin  BA1 0   1   0
Justin      BC2 0       0       1

и вот код SAS для его создания

         DATA Student1;
         INPUT Name $  Mark $ Math1 Math2 Math3;
        DATALINES;
        Justin  AA1  1 0 1
        Justin  BB1  1 1 1
        Justin  BA1  0 1 0
        Justin  BC2  0 0 1
        ;

Я хотел бы оценить Math1 и вывести отметку рядом с ним, если встречается 1, однако, поскольку эта позиция использовалась в Math1, она не может быть снова использована в Math2, т. Е. Вывод Джастина равен AA1 для Math1, BB1 для Math2 потому что именно там находится первая в столбце) и BC2 для Math3, потому что, хотя у нас есть 1 в одной строке с AA1 и BB1, эти две метки уже использовались в var Math1 и Math2.

Вот так должен выглядеть выходной набор данных

       data Student2;
       input name $ Math1 $ Math2 $ Math3 $;
        datalines;
       Justin AA1 BB1 BC2
       ;

Могу ли я сделать это с помощью массивов?

1 Ответ

0 голосов
/ 08 января 2012

Массив может быть недостаточным в этом случае.Следующее является решением (надеюсь) с использованием IML (хотя выглядит громоздким).Я предполагаю, что вам, возможно, придется иметь дело с более чем одним студентом, поэтому примените его в случае нескольких имен.Пожалуйста, прокомментируйте, если есть какая-либо ошибка.

  DATA Student1;
    INPUT Name $  Mark $ Math1 Math2 Math3;
      DATALINES;
        Justin  AA1  1 0 1
        Justin  BB1  1 1 1
        Justin  BA1  0 1 0
        Justin  BC2  0 0 1
        Wayne   AB1  1 0 1
        Wayne   BC1   0 0 1
        Wayne  BD2    0 1 0
        Wayne  BE3   1 1 1
        ;
  quit;

proc iml;
  use student1;
  read all var{name mark} into x;
  read all var{math1 math2 math3} into y;
z=j(nrow(y),ncol(y),'mon');
i=1;
   do j=2 to nrow(x);
     if x[j,1]^=x[j-1,1] | j=nrow(x) then do;
      if j=nrow(x) then j=j+1;
        do k=1 to 3;
          do l=i to j-1;
            if y[l,k]=1 then do;
             y[l,k:3]=0;
             y[l+1:j-1,k]=0;
             z[i:j-1,k]=x[l,2];
             end;
           end;
         end;
         i=j;
     end;
    end;
    colname={'math1', 'math2', 'math3'};
create new from z[colname=colname];
append from z;
quit;

data new;
merge student1(keep=name) new;
run;

proc sort data=new out=new nodupkey;
by name;
run;
...