Перенос предыдущего значения вперед при пропущенном значении в SAS - PullRequest
0 голосов
/ 08 февраля 2019

У меня есть следующий набор данных:

Player     Average1      Average2      Average3
001        .283          .             .302
002        .256          .             .
003        .314          .             .297
004        .282          .274          .

Я бы хотел, чтобы набор данных выглядел следующим образом:

Player     Average1      Average2      Average3
001        .283          .283          .302
002        .256          .256          .256
003        .314          .314          .297
004        .282          .274          .274

Таблица расширяется до Average24.Я знаком с тем, как сделать это для одной строки в R с пакетом dplyr, но не с SAS.

R:

Data = DATA %>% mutate(Average2 = ifelse(is.na(Average2), Average1, Average2))

Ответы [ 2 ]

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

С этой структурой вы можете использовать ARRAY.

data want;
  set have;
  array averages average1-average3 ;
  do _n_=2 to dim(averages);
    averages(_n_)=coalesce(averages(_n_),averages(_n_-1));
  end;
run;

Было бы проще с вертикальной структурой.Затем вы могли бы использовать оператор UPDATE для реализации операции LOCF (последнее наблюдение перенесено).

data have ;
  input player @;
  do rep=1 to 3 ;
     input average @;
     output;
  end;
cards;
001        .283          .             .302
002        .256          .             .
003        .314          .             .297
004        .282          .274          .
;
data want;
  update have(obs=0) have;
  by player;
  output;
run;
0 голосов
/ 08 февраля 2019

Используйте функцию coalesce , она назначит первое не пропущенное значение переменной из данного списка:

Average2=coalesce(Average1,Average2,Average3);

Если вы хотите, вы можете в дальнейшем использовать массивцикл для всех 24 переменных вместо записи вручную

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