SAS рассчитывает и суммирует, если условия на переменных верны

tjm02c спросил: 12 мая 2018 в 04:05 в: sas

У меня есть набор данных с тремя столбцами: Name, System, UserID. Я хочу подсчитать, сколько раз индивид появляется в отчете, но не учитывает их, если они разные люди с тем же именем. Различие производится с помощью поля UserID и только внутри одной системы. Если одно имя имеет несколько строк с одинаковой системой и другим идентификатором пользователя, все наблюдения с этим именем будут помечены для проверки. Для этого набора данных я бы хотел увидеть результат ниже.

Name       System   UserID
John Doe   Sys1     [blank]
John Doe   Sys1     AB1234
John Doe   Sys2     AB2345
Jane Doe   Sys1     AA2345
Jane Doe   Sys1     AA23456
Jane Doe   Sys2     AA2345
Joe Smith  Sys1     JS963
Joe Smith  Sys2     JS741Name       Count  System                      Follow-up
John Doe   1      Sys1 -                      Yes
John Doe   1      Sys1 - AB1234               Yes
John Doe   1      Sys2 - AB2345               Yes
Jane Doe   1      Sys1 - AA2345               Yes
Jane Doe   1      Sys1 - AA23456              Yes
Jane Doe   1      Sys2 - AA2345               Yes
Joe Smith  2      Sys1 - JS963, Sys2 - JS741  No

Любая помощь будет принята с благодарностью!

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

PROC SQL;     CREATE TABLE Sorted_Master_Original AS     SELECT Name,
            COUNT(Name) AS Total,
            System,
            UserID,
            CATX(' - ',System,UserID) AS SystemID     FROM Master_Original     WHERE Name <> ""     GROUP BY Name;QUIT;DATA TESTDATA.Final_Listing;LENGTH SystemsAccessed $200.;   DO UNTIL (last.Name);   SET Sorted_Master_Original;   BY Name NOTSORTED;   SystemsAccessed=CATX(', ',SystemsAccessed,SystemID);END;DROP System SystemID;RUN;

1 ответ

Есть решение
Richard ответил: 13 мая 2018 в 09:26

Случай определения сигнала над группой, а затем применение к каждому члену в группе может выполняться с использованием двух последовательностей DOW в последовательности. Первый - это то, как вы закодировали с тегом цикла last. и set и by в цикле, а второй - для повторного повторения группы через как и размерной петли над группой в отдельном буфере SET - при этом может быть применен сигнал.

Данные

data have;
length Name System UserID $20;
input Name & System & UserID; datalines;
John Doe   Sys1     .
John Doe   Sys1     AB1234
John Doe   Sys2     AB2345
Jane Doe   Sys1     AA2345
Jane Doe   Sys1     AA23456
Jane Doe   Sys2     AA2345
Joe Smith  Sys1     JS963
Joe Smith  Sys2     JS741
Bob Smith  Sys3     MS13
run;

Заказ по групповой обработке

proc sort data=have;
  by Name System UserId;
run;

Шаг DATA с последовательными циклами DOW

data want(keep=name count system_userid_list followup);
  * loop over name group;
  do _n_ = 1 by 1 until (last.name);
    set have;
    by name system userid;    * tests of conditions within the group determine some signal;    * check if there is more than one userid within a system within the name group;
    if not (first.system and last.system) then
      count = 1;
  end;  if not count then count = _n_;  length system_userid_list $200;
  followup = ifc(count=1 and _n_>1 ,'Yes','No');  * followup 'signal' will be applied/available to each row of the group;  * either output single row as followup, or concat to an aggregate list;
  * mixed output of singles and aggregates, good idea?;  * reiterate over group in second SET buffer;
  do _n_ = 1 to _n_;
    set have;
    item = catx(' - ',system,userid);
    if count > 1 then
      system_userid_list = catx(',',system_userid_list,item);
    else do;
      system_userid_list = item;
      output;
    end;
  end;  if count > 1 then output;
run;
tjm02c ответил: 13 мая 2018 в 11:21
это потрясающе, отлично работает. благодаря!