sas меняет последнее значение по группе на первое значение - PullRequest
1 голос
/ 11 февраля 2020

Я хочу изменить данные вида

id   value
1     1
1     1 
1     2  
2     7
2     7
2     7 
2     5
.     .
.     .
.     .

на

id   value
1     1
1     1 
1     1  
2     7
2     7
2     7 
2     7
.     .
.     .
.     .

То есть последнее значение по группе должно быть первым значением по группе. Я пробовал следующий код

data want;
set have;
by id;
last.value=first.value;
run;

Но это не сработало. Может ли кто-нибудь помочь мне?

Ответы [ 2 ]

7 голосов
/ 11 февраля 2020

Вы должны сохранить first.id значение в переменной и retain оно.

data want(drop=tValue);
   set have;
   by id;
   retain tValue;
   if first.id then tValue=value;
   if last.id then value=tValue;
run;
4 голосов
/ 11 февраля 2020

Проблема здесь в том, что first.value и last.value:

  • Не содержат фактическое значение, они просто сообщают вам, является ли наблюдение первым или последним в группе BY
  • Невозможно назначить - last.value = недопустимый синтаксис

Во-вторых, first.value и last.value устанавливаются, только если в by указана переменная value заявление. Вместо этого вы должны использовать first.id и last.id.

Здесь нам нужно сделать следующее:

  1. Проверьте, не смотрим ли мы на первое наблюдение в BY -группа на основе id
  2. Сохраняйте значение переменной value до тех пор, пока не будет достигнуто последнее id значение
  3. Когда мы смотрим на последнее значение id, затем устанавливаем значение из шага 1.

Ответ Алексея охватывает фактический синтаксис, необходимый для этого. Вот как выглядят значения first.id / last.id. (Вы всегда можете просмотреть их, добавив put _all_; в свой шаг данных):

id   value  first.id  last.id  tValue
1     1     1         0        1
1     1     0         0        1
1     2     0         1        1
2     7     1         0        7
2     7     0         0        7
2     7     0         0        7
2     5     0         1        7
.     .
.     .
.     .
...