2016-08-25 2 views
1

Я хочу вывести последнее значение переменной pr. подгруппы к набору данных SAS, предпочтительно всего за несколько этапов. Код ниже делает это, но я надеялся сделать это за один шаг a la by variable; if last.variable then output;, как и в случае с 1-мя переменными.SAS: вывести последнее значение по нескольким группам

data two; 
input year firm price; 
cards; 
1 1 48  
1 1 45 
2 2 50 
1 2 42 
2 1 41 
2 2 51 
2 1 52 
1 1 43 
1 2 52; 
run; 
proc sort data = two;by year firm;run; 

/* a) Create id across both sub-groups */ 
data two1; 
set two; 
by year firm; 
retain case_id; 
if FIRST.year OR first.firm then case_id + 1; 
run; 

/* b) Use id to output last values across both by-groups */ 
data two2; 
set two1; 
by case_id; 
if last.case_id then output; 
run; 

proc print data = two1;run; 
proc print data = two2;run; 

С помощью всего одной переменной можно выполнить два шага, обозначенные а) и б). Возможно ли это с несколькими группами?

+0

Обратите внимание, что первая/последняя запись для внешней группы всегда также первый/последний запись на одной из внутренних групп. Поэтому 'first.year OR first.firm' можно свести к' first.firm'. – Tom

ответ

1

В шаге данных a) добавить условие if lst.firm then output two2.

Окончательный код должен выглядит следующим образом:

data two1 two2; 
    set two; 
    by year firm; 
    retain case_id; 
    if FIRST.year OR first.firm then case_id + 1; 
    if last.firm then output two2; 
    output two1; 
run; 
+0

Спасибо! Это сработало. Я только создал «case_id» из-за шага b) в своем сообщении. Так что, поскольку мне действительно не нужен 'if last.firm then output;' будет делать. Работает ли это потому, что 'firm' является вторым в байтовом выражении, а затем относительно первой переменной-переменной (следовательно,' last' находится внутри групп, определяемых первой по-переменной)? –

+0

Да, это так. Поскольку «фирма» занимает 2-е место в бай-ин после года, это становится подгруппой для группы «год». Поэтому, когда изменяется значение 'year', оно также устанавливает флаги сначала и последним для переменной' firm'. Поэтому, когда установлен флаг 'last.firm', это означает, что одна из переменных' year' или 'firm' меняет значение в следующей записи. – Bagin

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