我正试图将一个相关矩阵转换为一个长列向量,这样我就有了以下结构
data want;
input _name1_$ _name2_$ _corr_;
datalines;
var1 var2 0.54
;
run;
我有以下代码,它输出name1和corr;然而,我正在努力获得名称2!
DATA TEMP_1
(DROP=I J);
ARRAY VAR[*] VAR1-VAR10;
DO I = 1 TO 10;
DO J = 1 TO 10;
VAR(J) = RANUNI(0);
END;
OUTPUT;
END;
RUN;
PROC CORR
DATA=TEMP_1
OUT=TEMP_CORR
(WHERE=(_NAME_ NE " ")
DROP=_TYPE_)
;
RUN;
PROC SORT DATA=TEMP_CORR; BY _NAME_; RUN;
PROC TRANSPOSE
DATA=TEMP_CORR
OUT=TEMP_CORR_T
;
BY _NAME_;
RUN;
感谢的帮助
你很接近。name变量遇到了一个奇怪的问题,因为它也变成了PROC TRANSPOSE中的一个变量。如果你重命名它,你就会得到你想要的。我还明确列出了变量,并添加了一些RENAME数据集选项,以获得您可能想要的内容。
PROC TRANSPOSE
DATA=TEMP_CORR (rename=_name_ = Name1)
OUT=TEMP_CORR_T (rename = (_name_ = Name2 col1=corr))
;
by name1;
var var1-var10;
RUN;
编辑:如果你不想重复,你可以在OUT数据集中添加一个WHERE。
PROC TRANSPOSE
DATA=TEMP_CORR (rename=_name_ = Name1)
OUT=TEMP_CORR_T (rename = (_name_ = Name2 col1=corr) where = name1 > name2)
;
by name1;
var var1-var10;
RUN;
只是一个带有VNAME((函数的ARRAY。为了只输出上三角形,将DO循环的下限设置为_N_。
data want ;
length _name1_ _name2_ $32 _corr_ 8 ;
keep _name1_ _name2_ _corr_;
set corr;
where _type_ = 'CORR';
array x _numeric_;
_name1_=_name_;
do i=_n_ to dim(x);
_name2_ = vname(x(i));
_corr_ = x(i);
output;
end;
run;