SAS считает и суммирует, если условия на переменные выполняются - PullRequest
0 голосов
/ 05 июня 2018

У меня есть набор данных с 3 столбцами: имя, система, идентификатор пользователя.Я хочу посчитать, сколько раз человек появляется в отчете, но не считать их, если это разные люди с одинаковыми именами.Различие осуществляется по полю 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     JS741


Name       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 Ответ

0 голосов
/ 06 июня 2018

Случай определения сигнала по группе и последующего применения к каждому члену в группе может быть выполнен с использованием двух последовательных циклов 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;
...