从宽到长格式的宏重塑表

时间:2014-02-24 16:16:04

标签: sas

我是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中)?或者至少我如何简化我的宏?更简单的方法来创建临时表?)

1 个答案:

答案 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);