Как выбрать первое вхождение поля и последнее вхождение другого поля одновременно в набор данных SAS? - PullRequest
0 голосов
/ 04 февраля 2019

У меня есть набор данных SAS (сгруппированный по ID, Sub_ID, упорядоченный по ID), скажем так:

ID        Sub_ID      Field_1         Field_2
1            4           4               8
1            5           9               5A

Желаемый вывод (Sub_ID не требуется в наборе выходных данных):

ID        Field_1         Field_2
1            4               5A

Что я хочу сделать?

Мне нужен вывод одной строки для каждого идентификатора, где значение Field_1 должно быть таким же, каким оно было для первого вхождения этого конкретного идентификатора, а Field_2 должно быть таким же, как былодля последнего вхождения конкретного идентификатора.

Если я использую First.ID, вывод будет

ID        Field_1         Field_2
1            4               8

А если я использую Last.ID, вывод будет

ID        Field_1         Field_2
1            9               5A

Я не уверен, как объединить эти два условия.

Ответы [ 3 ]

0 голосов
/ 04 февраля 2019

@ longfish ответ идеален, и это просто еще один способ сделать в SQL.

data have;
input ID        Field_1         Field_2 $;
datalines;
 1            4               8
 1            5               9
 1            9               5A
 ;


  data have_1/view=have_1;
  set have;
  val =_n_;
  run;

   proc sql;
    create table want as 
   select id, field_1,
 max(case when Field_2 =(select field_2 from have_1
                group by id having val=max(val))
      then field_2 end) as field_2
 from have_1
group by id
having val=min(val);

enter image description here

0 голосов
/ 04 февраля 2019

Вот еще одно решение с шагом данных, использующее цикл DOW вместо сохранения:

data have;
input ID Field_1 Field_2 $;
datalines;
1 4 8
1 9 5A
;
run;

data want;
do until(last.id);
  set have;
  by id;
  if first.id then field_1_1st = field_1;
end;
field_1 = field_1_1st;
drop field_1_1st;
run;

Это загружает каждую строку по очереди, но выводит только последнюю строку для каждого идентификатора, поэтому вам не нужнообрабатывать его как особый случай.

Примечание: это будет работать, только если ваш входной набор данных не содержит поле с именем field_1_1st.Если это так, значение из первой строки для каждого идентификатора не будет перенесено.

0 голосов
/ 04 февраля 2019

Все, что вам нужно сделать, это сохранить первое значение в новой переменной (используя оператор retain для копирования его по строкам), а затем вывести его, когда вы достигнете последнего значения для идентификатора.Следующий код сделает это, основываясь на текущем порядке сортировки данных.Я предполагаю, что ваши реальные данные имеют дополнительную переменную, которая позволит правильно сортировать данные.

data have;
input ID Field_1 Field_2 $;
datalines;
1 4 8
1 9 5A
;
run;

data want;
set have;
by id;
retain field_1_1st;
if first.id then field_1_1st = field_1;
if last.id then do;
    field_2_last = field_2;
    output;
    end;
drop field_1 field_2;
run;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...