SAS Как создать счетчик для уменьшения правил изменения переменных - PullRequest
0 голосов
/ 06 декабря 2018

У меня проблемы с попыткой уменьшить счетную переменную на основе правил других переменных, предоставленных мне клиентом.

В настоящее время у меня есть столбец "HAVE", но я хочу достичь"ХОЧУ"

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

вот пример, есть моя попытка, где ХОЧУ желаемый результат (я думаю).

 DATA HAVE;
    LENGTH
        ID 8 DATE_OF_VALUE $10 VALUE 8 HAVE 8 WANT 8 ;
    FORMAT
        ID 9. DATE_OF_VALUE $10. VALUE 5. HAVE 1. WANT 1. ;
    INFORMAT
        ID 9. DATE_OF_VALUE $10. VALUE 5. HAVE 1. WANT 1. ;
    INFILE DATALINES4
        DLM=','
        MISSOVER
        DSD ;
    INPUT
        ID : 9. DATE_OF_VALUE : $10. VALUE: 5. HAVE: 1.WANT : 1. ;
DATALINES4;
109999999,05/12/2017,42376,1,5
109999999,05/12/2017,42376,2,.
109999999,13/12/2017,42521,1,4
109999999,13/12/2017,42521,2,.
109999999,19/03/2018,43395,1,3
109999999,19/03/2018,43395,2,.
109999999,19/03/2018,43395,3,.
109999999,19/03/2018,43395,4,.
109999999,04/06/2018,43953,1,2
109999999,04/06/2018,43953,2,.
109999999,17/09/2018,44899,1,1
109999999,17/09/2018,44899,2,.
109999998,21/04/2018,4788,1,2
109999998,21/04/2018,4788,2,.
109999998,01/06/2018,4788,3,.
109999998,01/06/2018,4788,4,.
109999998,23/09/2018,4718,1,1
109999998,23/09/2018,4718,2,.
109999997,09/07/2018,8717,1,2
109999997,09/07/2018,8717,2,.
109999997,01/09/2018,8750,1,1
109999997,01/09/2018,8750,2,.
109999995,15/02/2018,22868,1,2
109999995,15/02/2018,22868,2,.
109999995,07/09/2018,22631,1,1
109999995,07/09/2018,22631,2,.
109554995,05/12/2017,92376,1,5
109554995,05/12/2017,92376,2,.
109554995,13/12/2017,92521,1,4
109554995,13/12/2017,92521,2,.
109554995,19/03/2018,93395,1,3
109554995,19/03/2018,93395,2,.
109554995,19/03/2018,93395,3,.
109554995,19/03/2018,93395,4,.
109554995,04/06/2018,93953,1,2
109554995,04/06/2018,93953,2,.
109554995,11/07/2018,94953,1,1
;;;;

1 Ответ

0 голосов
/ 06 декабря 2018

Одним из способов решения этой проблемы является так называемый двойной цикл DOW.

Вы читаете данные в группах идентификаторов дважды.Вы увидите два цикла do в коде.Первый читает записи в группе идентификаторов, чтобы подсчитать количество уникальных дат.Второй затем перечитывает те же записи и выводит их с уменьшенным счетчиком.

Обратите внимание, что в моем HAVE я читаю вашу переменную date_of_value как числовую переменную даты, чтобы она была отсортирована.Если вы хотите оставить его как символ, вы можете добавить шаг сортировки процедур.

data want ;

  *Count the number of distinct for an ID group; 
  do until (last.id) ;
    set have (keep=ID Date_Of_Value Value rename=(Date_Of_value=Date));
    by descending id date  ;
    if first.date then _DateCount=sum(_DateCount,1) ;
  end ;

  *Re-read the records for the ID group, decrementing the counter and outputting ;

  do until(last.id) ;
    set have (keep=ID Date_Of_Value Value rename=(Date_Of_value=Date));
    by descending id date  ;
    if first.id then Want=_DateCount ;
    else if first.date then Want=Want-1 ;
    output ;
  end ;
run ;

Это дает повторяющиеся значения WANT в группе покупки, которая отличается от вашей WANT, где у вас отсутствуют значения после WANT.в повторяющиеся даты:

    ID        Date    VALUE    Wan

109999999    21158    42376      5
109999999    21158    42376      5
109999999    21166    42521      4
109999999    21166    42521      4
109999999    21262    43395      3
109999999    21262    43395      3
109999999    21262    43395      3
109999999    21262    43395      3
109999999    21339    43953      2
109999999    21339    43953      2
109999999    21444    44899      1
109999999    21444    44899      1
109999998    21295     4788      3
109999998    21295     4788      3
109999998    21336     4788      2
109999998    21336     4788      2
109999998    21450     4718      1
109999998    21450     4718      1
109999997    21374     8717      2
109999997    21374     8717      2
109999997    21428     8750      1
109999997    21428     8750      1
109999995    21230    22868      2
109999995    21230    22868      2
109999995    21434    22631      1
109999995    21434    22631      1
109554995    21158    92376      5
109554995    21158    92376      5
109554995    21166    92521      4
109554995    21166    92521      4
109554995    21262    93395      3
109554995    21262    93395      3
109554995    21262    93395      3
109554995    21262    93395      3
109554995    21339    93953      2
109554995    21339    93953      2
109554995    21376    94953      1

Мне не нравятся пропущенные значения, но вы можете обновить это, чтобы создать пропуски, если хотите.:)

...