Установка условий в массивах в SAS - PullRequest
0 голосов
/ 04 октября 2018

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

ID  Status31Jan2007 Status28Jan2007 Status31Mar2007
001                        0               0             
002        1               0               0
003        1               1               0

У меня есть поля Statusddmmyyyy либо '0', либо '1' в течение 118 месяцев.(здесь у меня только три месяца в качестве образца)

Я хочу получить такие результаты:

ID       Flag1           Flag2           Flag3 
001        N               N               N            
002        Y               N               N
003        Y               Y               N

Логика такова, если по состоянию31Jan2007 = 1 и следующие два месяца, количество полей состояния с 0> 0, затем пометьте его как 'Y'.Иначе, N.

Значение, если мой идентификатор 001 и как на Status31Jan2007, значение отсутствует, я отмечаю его как 'N' под Flag1.Переходя к следующему месяцу, Status28Feb2007, значение равно 0, я автоматически помечаю его как 'N', а также под Flag2.Это относится к следующему месяцу.

Глядя на идентификатор 002, Status31Jan2007 равен 1. И через два месяца у меня есть два значения 0.Количество значений «0»> 0. Поэтому я отмечаю его как «Y» под Flag1.Но, как и в Status28Feb2007, он равен 0. Он не соответствует критериям, поэтому я отмечаю его как 'N' в Flag2.

Пока на поле мне нужен статус 1, тогда только я продолжаюзаглянуть в следующие два месяца.

После получения результатов, как подсчитать количество флагов N и Y в каждом поле?

        Count1           Count2          Count3
N          1               2               3 
Y          2               1               0

Буду признателен за помощь, поскольку я новичок в SAS.Благодаря.

1 Ответ

0 голосов
/ 04 октября 2018

Это будет работать только в том случае, если имена столбцов расположены в календарном порядке.

Используйте оператор ARRAY для организации, а затем доступа к переменным по индексу и, таким образом, с легкостью обрабатывайте [index + 1] и [index+2] проверяет, указывает ли ваша логика.Вы также можете использовать временные массивы для поддержания счетчика при назначении значений флага;в последней строке значения выводятся в отдельную таблицу.

Примечание: для переменных состояния, принимающих либо 0, либо 1, число 1 можно вычислить с помощью SUM.Сумма двух переменных состояния будет <2, когда любая из них равна 0. </p>

* simulate some data;
data prelim;
  do id = 1 to 20;
    do date = '01jan07'd by 1 until(intck('month', '01jan07'd, date) >= 117);
      date = intnx('month', date, 1) - 1;
      status = ranuni(123) < 0.45;
      if date = '31jan07'd and mod(id,5) = 1 then status = .;
      output;
    end;
  end;
  format date date9.;
run;

* change the shape of simulated data to match the question;
proc transpose data=prelim prefix=Status out=have(drop=_name_);
  by id;
  var status;
  id date;
run;

* process the problem shaped data;    
data
  want (keep=id status: flag:)
  want_count (keep=flag_value count:);
;
  set have end=lastid;

  retain sentinel1 sentinel2 0;

  array status status: sentinel1 sentinel2;  * map all the Status* variables to an array named status;
  array flag [118] $1 ; * automatically creates 118 new variables flag1 to flag118;
  array yfreq [118] _temporary_ (118*0); * temporary arrays initialized to 0;
  array nfreq [118] _temporary_ (118*0);

  * process each month status, -2 because of the sentinels ;
  do i = 1 to dim(status)-2;

    * assign flag according to the logic, some cases require a 2-month look ahead;
    select;
      when ( status(i) = . ) flag(i) = 'N';
      when ( status(i) = 0 ) flag(i) = 'N';
      when ( status(i) = 1 
             and sum(status(i+1),status(i+2)) < 2 ) flag(i) = 'Y';  * SUM trick;
      otherwise
        flag(i) = 'N';
    end;

    * track frequencies of flags assigned;
    if flag(i) = 'N'
      then nfreq(i)+1;
      else yfreq(i)+1;
  end;

  output want;

  if lastid then do;
    * all flags for all ids have been binned for frequency;
    * output the freqs to a count data set;
    length flag_value $1;
    array freq count1-count118;
    flag_value = 'N'; do i = 1 to dim(nfreq); freq(i) = nfreq(i); end; output want_count;
    flag_value = 'Y'; do i = 1 to dim(yfreq); freq(i) = yfreq(i); end; output want_count;
  end;
run;
...