2012-01-06 1 views
0

Мой Список Данных Набор данных: Наименование Марка Math1 Math2 Math3 ----------------------------- --------Выходное наблюдение, если соответствует критериям

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, т. е. выход Justin - AA1 для Math1, BB1 для Math2 (потому что именно там находится первый столбец) и BC2 для Math3, потому что хотя у нас есть 1 в одной строке с AA1 и BB1, эти две метки уже использовались в var Math1 и Math2.

Это то, что набор выходных данных должен выглядеть

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

Могу ли я сделать это, используя массивы?

+0

Это похоже на проблему, связанную с управлением набором входных данных перед выдачей набора данных решения. Если вы можете опубликовать более точное представление о вашем наборе входных данных, можно найти решение. Не могли бы вы включить шаг данных с datalines, чтобы можно было протестировать решение? –

+0

Есть ли обязательный заказ от math1 до math3? например, если вторая строка «Justin BB1 0 0 1», то мы пропустим эту строку или выведем bb1 и пропустим четвертую строку bc2, поскольку math3 был использован? –

+0

Правильно, Робби пропускаем строку, потому что 1 - индикатор, в этом случае 1 находится в столбце три, поэтому мы выводим знак в четвертой строке. Знак должен быть уникальным, т. Е. Не может выводиться дважды - это сложная часть – Makoto

ответ

0

Массив может быть недостаточным в этом случае. Следующее - это решение (надеюсь) с использованием 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; 
+0

благодаря Robbie-great solution - я думал, что это может быть связано с IML - я блуждал, есть ли способ вокруг него – Makoto