Объединение нескольких наблюдений в одну строку

У меня есть список из 2 столбцов имен (в столбце 1) и систем (в столбце 2). Я пытаюсь создать таблицу, которая показывает одно наблюдение для каждого человека в списке, количество вхождений их имен и список систем, к которым у них есть доступ.

Я основываю свой код на примере здесь, но мои переменные в столбце 2 не являются числовыми, и я продолжаю получать предупреждение «ПРИМЕЧАНИЕ: Недопустимые числовые данные, System = 'XYZ'», а в созданной таблице только точки во всех системных ячейках.

Мой код ниже, что мне не хватает?

PROC SQL;

     CREATE TABLE TESTDATA.sorted_import AS

     SELECT Name,
            System format=$15.,
            COUNT(Name) AS Total

     FROM TESTDATA.Master_Test

     WHERE Name <> ""

     GROUP BY Name;

QUIT;

DATA UniqueList (keep= Name System1-System22);
    RETAIN Total Name System1-System22;
    ARRAY UniqueList(*) System1-System22;
    SET TESTDATA.sorted_import;
    BY Name;
    IF first.name then do;
        i=1;
        CALL MISSING(of UniqueList(*));
END;

    UniqueList(i)=System;
    IF last.name then output;
    i+1;
RUN;

person tjm02c    schedule 31.05.2018    source источник
comment
Вместо этого транспонируйте его, вместо этого PROC TRANSPOSE автоматически создаст переменные System1-System22. статистика .idre.ucla.edu / sas / modules /   -  person Reeza    schedule 31.05.2018
comment
Итак, я остановился на маршруте PROC TRANSPOSE, но теперь у меня возникла проблема с людьми, имеющими несколько ролей в одной системе, поэтому одна и та же система указывается несколько раз. Как мне сохранить это в одном экземпляре системы для каждого пользователя? Мой код ниже. PROC TRANSPOSE DATA=Sorted_Master_Original OUT=Names_Transposed_Data NAME=Nothing PREFIX=System; BY UserName; VAR System; RUN;   -  person tjm02c    schedule 31.05.2018
comment
Добавьте шаг между SQL и PROC TRANSPOSE, используя PROC SORT, которая удаляет дубликаты. PROC SORT NODUPKEY - это то, что вы ищете. Мне неизвестна возможность их удаления в PROC TRANSPOSE, может быть способ через DISTINCT в PROC SQL, но я не уверен.   -  person Reeza    schedule 31.05.2018


Ответы (2)


Если я понял ваш вопрос, пробовали ли вы определить свой массив с помощью символьных переменных ?:

DATA UniqueList (keep= Name System1-System22);
    RETAIN Total Name System1-System22;
    ARRAY UniqueList(*) $ 15 System1-System22;
    SET TESTDATA.sorted_import;
    BY Name;
    IF first.name then do;
        i=1;
        CALL MISSING(of UniqueList(*));
END;

    UniqueList(i)=System;
    IF last.name then output;
    i+1;
RUN;
person Amir    schedule 31.05.2018
comment
Что ж, это было достаточно просто, я чувствую себя глупо. Спасибо за помощь! - person tjm02c; 31.05.2018
comment
Без проблем. Мы все были там. - person Amir; 31.05.2018

Использование явного цикла для группы SET BY с неявным ведением учета можно считать более чистым, чем использование неявного цикла с явным «ведением учета» (сохранение / отсутствие вызова) и без априорного шага для вычисления размера группы (total).

data have (keep=name system);
  do name = 'A', 'B', 'C', 'D', 'E';
    p = 10 * ranuni(123);
    q = (26 - p) * ranuni(123);
    do c = p to q;
      system = byte(65+c);
      output;
    end;
  end;
run;

data want;
  do total = 1 by 1 until (last.name); /* explicit loop over by group */
    set have;
    by name;
    array list(*) $15 system1-system22;
    list(total) = system;
  end;
  drop system;
run;

Неявный учет состоит в том, что переменные, не являющиеся набором данных, сбрасываются на отсутствующие в верхней части неявного цикла и неявные output, когда поток программы достигает нижней части шага ДАННЫЕ.

person Richard    schedule 31.05.2018