2016-08-18 6 views
1

у меня есть набор данных, и это выглядит следующим образом:как найти отставание первого наблюдения в сгруппированных данных в SAS

id name score 

1 daniel 30 
1 jane 20 
1 keisha 70 
2 kelly 30 
2 jerry 60 
2 jay  40 

я хочу найти разницу между баллами, сравнивая ПЕРВОЕ балла каждая группа ко всем другим оценкам в этой группе. Так, например,

я хочу, чтобы сравнить счет Джейн к Дэниелу (30-20 = 10) и сравнить счет Кейши, чтобы Дэниэла (абс (30-70) = 40)

И начать сначала путем сравнения Джерри оценка до келли (абс (30-60 = 30)) и оценка сойки к келли (40-30 = 10).

ID Название сравнить

1 daniel 30 . 
1 jane 20 10 
1 keisha 70 40 
2 kelly 30 . 
2 jerry 60 30 
2 jay  40 10 

Кто-нибудь знает способ, чтобы написать это в SAS? или любую команду SQL?

Я попытался следующие

data scoring_prep; 
    set scoring_prep; 
    by id; 
    if not missing(score) then do; 
    scorediff = abs(dif(score)); 
    if id ne lag(id) then scorediff = .; 
    end; 
run; 

, но это только находка обеспечивает отставание предыдущей записи, так Keisha, например, будет сравниваться с Джейн вместо Дэниела.

+0

Вы можете показать, что вы пытали, и почему это не так? – Tom

+0

спасибо Том, только что обновил мой пост – pynewbee

+0

Ваша функция 'lag' находится внутри оператора' if'. Это большой нет-нет. Если он преднамерен, то он должен быть прокомментирован как таковой. Вы действительно должны прочитать документацию lag(), если вы планируете использовать эту функцию в будущем. –

ответ

4

Поскольку вы не сравниваете предыдущее значение, вы не хотите использовать функцию LAG() или DIF(). Вместо этого используйте сохраненную переменную для переноса значения сравнения вперед.

data want; 
    set scoring_prep; 
    by id; 
    retain baseline; 
    if first.id then baseline=score; 
    else scorediff=abs(baseline - score); 
run; 
+0

СПАСИБО ТОЛЬКО, что мне нужно! – pynewbee