Объединение нескольких наблюдений в одну строку - PullRequest
0 голосов
/ 31 мая 2018

У меня есть список из 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;

Ответы [ 2 ]

0 голосов
/ 31 мая 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, когда поток программы достигает нижней части шага DATA.

0 голосов
/ 31 мая 2018

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

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;
...