我需要一次对各种变量进行总结。此外,对于每个变量,yi求和,存在链接的类变量xi。
代码看起来像这样:
proc means data=test sum;
class x1-x100;
var y1-y100;
run;
对于var y1,不使用类x1,而是使用x1-x100作为var y1的类,对于y2,...,y100使用相同的类。 我如何编写它,使得var y1具有类x1,var y2具有类x2,依此类推? 我的输出应该在一个大表中。
答案 0 :(得分:2)
为什么不只是转置数据,而不是100对变量,你有一对变量和100行?我们来做一些样本数据:
data have ;
input x1-x2 y1-y2 ;
cards;
1 1 3 4
1 2 5 6
2 1 7 8
2 2 9 0
;
现在通过将X转换为CLASS
变量并将Y转换为VALUE
变量来转置它。我们将使用INDEX
来记录此观察所代表的许多类/值对中的哪一个。
data tall ;
set have ;
array x x1-x2;
array y y1-y2;
do index=1 to dim(x);
class=x(index);
value=y(index);
output;
end;
run;
现在我们只使用PROC SUMMARY
(又名PROC MEANS)来计算总和。
proc summary nway;
class index class ;
var value;
output out=want sum=sum;
run;
我们可以打印结果:
proc print ;
var index class sum ;
run;
index class sum
1 1 8
1 2 16
2 1 12
2 2 6
假设组合数量不超过可用内存量,您也可以在PROC SUMMARY之后进行转置。
首先使用WAYS 1
运行PROC SUMMARY以限制使用的类变量的数量。使用CHARTYPE
一次允许这么多类变量。要使结果按X1,X2,... X100的顺序出现,请以相反的顺序引用CLASS
和VAR
语句中的变量。
proc summary data=have chartype ;
class x2-x1;
ways 1;
var y2-y1;
output out=step1 sum= ;
run;
现在取结果并使用_TYPE_
变量将类变量与正确的sum变量匹配。
data want ;
length class_name sum_name $32 ;
set step1 ;
array x x2-x1 ;
array y y2-y1 ;
i=indexc(_type_,'1') ;
class_name = vname(x(i));
sum_name=vname(y(i));
class=x(i);
sum=y(i);
drop _type_ i x: y: ;
run;
结果:
class_
name sum_name _FREQ_ class sum
x1 y1 2 1 8
x1 y1 2 2 16
x2 y2 2 1 12
x2 y2 2 2 6
答案 1 :(得分:0)
听起来像PROC TABULATE给我。
data have;
array x[100];
array y[100];
do _n_ = 1 to 1e4;
do _i = 1 to 100;
x[_i] = rand('BINOMIAL',.3,3);
y[_i] = rand('UNIFORM');
end;
output;
end;
run;
proc tabulate data=have;
class x1-x100;
var y1-y100;
tables
x1*y1=' '
x2*y2=' '
x100*y100=' ',sum;
run;
使用宏循环填充当然的完整列表。
答案 2 :(得分:0)
尝试使用call execute。
<强>修饰:强>
data _null_;
set have(obs=1);
array x x:;
array y y:;
do i=1 to dim(x);
call execute(
'proc means nway data=have sum;
class x'||strip(i)||';
var y'||strip(i)||';
output out=temp sum=;
run;');
if i=1 then call execute(
'data want;
set temp(drop=_:);
run;');
else call execute(
'data want;
merge want temp(drop=_:);
run;');
end;
run;
答案 3 :(得分:0)
如果它有用,可以选择汤姆和乔的解决方案。 Proc表格以创建可打印报告和输出数据集。然后处理proc选项卡中的输出数据集以根据需要组合事物。
data have ;
input x1-x3 y1-y3 ;
cards;
1 1 3 4 5 6
1 2 5 6 7 8
2 1 7 8 9 10
2 2 9 0 11 12
;
%macro x_by_y;
proc tabulate data=have
out=table_out(keep=x: y: _type_)
noseps
format=comma10.0;
class x1-x3;
var y1-y3;
table
%do i = 1 %to 3;
x&i.*y&i.=' '
%end;
, sum;
run;
data table2(keep=classvar ysum);
set table_out;
array ysums[*] y:;
x_index=indexc(_type_, '1');
classvar= compress('x' || x_index);
ysum = max(of ysums[*]);
run;
proc print data=table2 noobs;
run;
%mend x_by_y;
%x_by_y;