我是SAS新手。我尝试创建一个宏,将矩阵重新整形为长格式。 更具体地说,有一个矩阵i,j我想把它变换成一个表:
Table(col,row,value)
这是我的代码,我正在使用proc transpose
:
%macro reshape(in_A = ,
ou_A= );
/* add new sequence column */
data _&in_A.;
set &in_A.;
row = _n_;
run;
/* reshape the matrix by row to long format */
proc transpose data=_&in_A. out=__&in_A.;
by row;
run;
/* rename column and remove extra column*/
data &ou_A.;
set __&in_A. (rename=(col1=value));
drop _name_;
run;
/* remove temporary data sets */
PROC DATASETS;
DELETE permute _&in_A.;
DELETE permute __&in_A.;
QUIT;
%mend;
我的代码工作正常,但是我付出的代价是复杂的任务?有没有人能告诉我是否有更简单的方法(当然在基础SAS中)?或者至少我如何简化我的宏?更简单的方法来创建临时表?)
答案 0 :(得分:2)
您可以在一个data step
中完成所有这些操作。
/*make up a matrix that is 100rowsx10cols*/
data have;
array myCols{*} col1-col10;
do i = 1 to 100;
do j = 1 to dim(myCols);
myCols{j}=ranuni(123);
end;
output;
end;
drop i j;
run;
上述数据集将包含100行和10列,不包括行/列标识符(如果您正在查看Enterprise Guide中的数据集 - 您将在边距中看到行和列名称。)
data want;
set have;
/*loading the 10 columns into an array*/
array turnTheseColumnsAround{*} _numeric_;
i = _n_;/*specifying the row identifier*/
do j = 1 to dim(turnTheseColumnsAround);
/*going through each of the 10 elements in the array and output them to a new line*/
value= turnTheseColumnsAround{j};
output;
end;
keep i j value;
run;
上面的数据集正好有三列而且没有。行数将等于100x10。
宏版本:
%macro reshape(in_A = ,
ou_A= );
data &ou_A.;
set &in_A.;
array turnTheseColumnsAround{*} _numeric_;
i = _n_;
do j = 1 to dim(turnTheseColumnsAround);
value= turnTheseColumnsAround{j};
output;
end;
keep i j value;
run;
%mend;
%reshape(in_A=have, ou_A=want2);