2015-06-25 2 views
0

У меня есть таблица, как показано ниже:tranfromation данных с, если потом еще

id term subj degree 
    18 2007 ww  Yes 
    32 2015 AA  Yes 
    32 2016 AA  No 
    25 2011 NM  No 
    25 2001 ts  No 

    18 2009 ww  Yes 
    18 2010 ww  No 

мне нужна другая переменная term2 если степень Да, и я буду писать term2 любой такой же идентификатор и Subj в перспективе. Таким образом, означает:

id term subj degree term2 
    18 2007 ww  Yes  2009 
    32 2015 AA  Yes  2016 
    32 2016 AA  No   0 
    25 2011 NM  No   0 
    25 2001 ts  No   0 

    18 2009 ww  Yes  2010 
    18 2010 ww  No   0 

Что я сделал, если тогда еще не работает. Есть идеи? Спасибо

это один я использовал

data have; 
    merge aa aa (rename=(id=id1 subj=subj1  
     term=term1); 
    term2=0; 
    if id=id1 and subj=subj1 and degree="Yes" then 
    term2=term1 

    run; 
+2

Что вы сделали, если тогда еще? Каким образом это не сработало? – Joe

+0

Пожалуйста, покажите свой код, который вы пробовали до сих пор. –

ответ

0

Там не хватает какой-то важную информацию, как, когда идентификатор имеет степень = да значение, которое всегда степень = нет строк с одинаковым идентификатором ? Что делать, если для одного идентификатора более одного уровня = нет строк с разными терминами, если у него также есть значение степени = да? Почему вы хотите решить это с помощью инструкции if-else? Предполагая, что вы всегда точно одну степень Ид соответствия = нет строки для строки со степенью = да, вы не можете использовать это:

Proc sql; 
Select a.*, case when a.degree = "Yes" then b.term else 0 end from table as a 
left outer join table as b on a.id = b.id and b.degree = "No" and a.degree="Yes"; 
quit; 

Это не если-заявление и не datastep, но вы должны предоставить дополнительную информацию, если вам нужно более конкретное решение.

+0

ОШИБКА: Результат предложения WHEN 2 - это не тот же тип данных, что и предыдущие результаты. – joys

+0

Я изменил таблицу на основе вашего вопроса. – joys

+0

Если термин является буквенно-цифровым, вы должны использовать вместо него «0». – kl78

0
data have; 
input id term subj $ degree $; 
cards; 
    32 2015 AA  Yes 
    32 2016 AA  No 
    25 2011 NM  No 
    25 2001 ts  No 
    18 2007 ww  Yes 
    18 2010 ww  No 
; 

data want; 
    merge have have(firstobs=2 keep=id term rename=(id=_id term=_term)); 
    term2=0; 
    if id=_id and degree='Yes' then term2=_term; 
    drop _:; 
run; 
+0

Он работает, но не только из-за причины. Многие значения Да имеют «0» term2. Некоторые из них правы – joys

+0

Я обновил вопрос, основанный на том, почему он не работает. Он работает только при том же значении сразу после другого значения. В противном случае не работает. – joys

+0

Итак, вам нужно сначала отсортировать данные по идентификатору. –

Смежные вопросы