我想知道是否有可能在SAS中使用proc sql从宽有效地转换成长有效。
我知道proc换位比我在下面建议的方法要快得多。但是我的目标之一是避免存储转置表。
例如,假设我有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|
我可以做到这一点;
选择id,’A’作为col1,A作为 来自table1的col2 , 其中A〜=“” 联合选择id,’B’作为col1,B作为 来自table1的col2 , 其中B〜=“” 等
但是效率很低。
任何的想法?谢谢。
如果您在中SAS,请使用PROC TRANSPOSE此选项。PROC SQL;尽管许多SQL变体都有自己的数据透视方式,SAS并且已经PROC TRANSPOSE并且希望您使用它,但是没有特别好的方法来执行此操作。
SAS
PROC TRANSPOSE
PROC SQL;
SQL
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;