将多个观察结果合并为一行

Combining multiple observations into one line

我有一个 2 列的名称列表(第 1 列)和系统(第 2 列)。我正在尝试创建一个 table 来显示列表中每个人的一个观察结果、他们的名字出现次数以及他们有权访问的系统列表。

我的代码基于 the example here,但我在第 2 列中的变量不是数字,我不断收到警告 "NOTE: Invalid numeric data, System='XYZ'" 并且创建的 table 中只有句点所有系统单元格。

我的代码在下面,我缺少什么?

PROC SQL;

     CREATE TABLE TESTDATA.sorted_import AS

     SELECT Name,
            System format=.,
            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;

如果我理解了你的问题,你试过用字符变量定义你的数组吗?:

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;

在带有隐式簿记的 SET BY 组上使用显式循环比使用带有显式 'bookkeeping'(retain/call 缺失)且没有计算组大小的先验步骤的隐式循环更清洁( 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(*)  system1-system22;
    list(total) = system;
  end;
  drop system;
run;

隐式簿记是在隐式循环顶部将非数据集变量重置为缺失,并在程序流到达 DATA 步底部时将隐式 output 重置。