4

我想知道是否可以在 sas 中使用 proc sql 从宽到长有效地转置。

我知道 proc transpose 比我在下面建议的方法快得多。但我的目标之一是避免存储转置表。

例如,假设我有 table1 作为

Id|   A|   B|   C|  D    
_____________________
 1|  100|3500|6900| 10300
 2|  200| 250| 300| 350
 3|  150|  32| 400| 204
 4|  200| 800|1400| 2000

我想把它变成

id|col1|  col2|
______________
 1|   A|   100|
 1|   B|  3500|
 1|   C|  6900|
 1|   D| 10300|
 2|   A|   200|
 2|   B|   250|
 2|   C|   300|
 2|   D|   350|
 3|   A|   150|
 3|   B|    32|
 3|   C|   400|
 3|   D|   204|
 4|   A|   200|
 4|   B|   800|
 4|   C|  1400|
 4|   D|  2000|

我可以这样做;

select id, 'A' as col1, A as col2
from table1
where A ~=""
union select id, 'B' as col1, B as col2
from table1
where B ~=""
etc

但它的效率非常低。

任何想法?谢谢。

4

2 回答 2

8

如果您在 中SAS,请使用PROC TRANSPOSE此选项。没有特别好的方法可以做到这一点,PROC SQL;而许多SQL变体都有自己的方式来透视数据,SAS并且PROC TRANSPOSE希望您使用它。

SAS 数据步也非常有效地执行此操作,甚至可能比PROC TRANSPOSE. 这是一个示例,包括创建注释中所述的视图。

data want/view=want;
set have;
array vars a b c d;                  *array of your columns to transpose;
do _t = 1 to dim(vars);              *iterate over the array (dim(vars) gives # of elements);
  if not missing(vars[_t]) then do;  *if the current array element's value is nonmissing;
    col1=vname(vars[_t]);            *then store the variable name from that array element in a var;
    col2=vars[_t];                   *and store the value from that array element in another var;
    output;                          *and finally output that as a new row;
  end;
end;
drop a b c d _t;                     *Drop the old vars (cols) and the dummy variable _t;
run;
于 2013-08-19T18:02:44.487 回答
1

我今天实际上做了这样的事情。尝试这样做,

proc transpose data = ORIGINAL_DATA;
        out = NEW_DATA;
    by id;
    VAR A-D;
run;

我认为这应该有效。

于 2013-08-19T18:03:25.700 回答