将多个观察结果合并为一行
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
重置。
我有一个 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
重置。