Захватить строку из последней ячейки, которая не пропущена в SAS - PullRequest
0 голосов
/ 20 ноября 2018

HAVE - это набор данных авторов в пабах:

enter image description here

^ обратите внимание, что auth50 - последняя переменная в наборе данных.

WANT - это набор данных, в котором первый и последний авторы для каждого наблюдения HAVE являются своими собственными переменными:

enter image description here

Я делаюследующее в шаге данных для создания lastauth ...

array auths {*} auth1:auth50;
do i=1 to dim(auths);
    if auths{1} NE " " then firstauth = auths{1};
    if auths{i}  = " " then lastauth = auths{i-1}; 
else lastauth = auths{i};
end;

... который, как я думал , будет итеративно записывать поверх lastauth, пока не встретится последняя переменная authX, но код не возвращает последнее не пропущенное значение.Есть мысли о том, что я неправильно понимаю?Спасибо!

1 Ответ

0 голосов
/ 20 ноября 2018

Тщательно проверьте логику.Вы хотите установить значение FIRST, когда FIRST отсутствует, и установить значение LAST, если ток НЕ отсутствует.

array auths auth1-auth50;
firstauth=auths(1);
do i=1 to dim(auths);
  if missing(firstauth) then firstauth = auths{i};
  if not missing(auths{i}) then lastauth = auths{i}; 
end;

Примечание. Дополнительное назначение перед циклом DO - заставить SAS определить новую переменную, так как в противном случае первое использование будет в условии IF.Если у вас уже есть LENGTH или другой оператор, который определяет FIRSTAUTH, тогда дополнительный оператор присваивания не требуется.

Или пропустите массив и просто используйте функцию COALESCEC (), чтобы найти первое значение.И просто измените порядок переменных, чтобы также использовать его для поиска последнего значения.

firstauth = coalescec(of auth1-auth50);
lastauth = coalescec(of auth50-auth1);
...