如何保存sas中出现最大值的列和行值
我需要找到最大值出现在下三角协方差矩阵中的行和列。然后,我可以用missing替换整行和整列。这里有一个选项可以做到这一点-我建议R可以使它更容易,但在SAS中,这会起作用(不是IML-我个人不知道IML) 首先,创建一个假设的三角形矩阵如何保存sas中出现最大值的列和行值,sas,max,Sas,Max,我需要找到最大值出现在下三角协方差矩阵中的行和列。然后,我可以用missing替换整行和整列。这里有一个选项可以做到这一点-我建议R可以使它更容易,但在SAS中,这会起作用(不是IML-我个人不知道IML) 首先,创建一个假设的三角形矩阵 DATA test; INPUT v1 v2 v3 v4 v5 v6 v7; DATALINES; 0.13 . . . . . . 0.21 0.30 . . . . . 0.31 0.52 0.79 . . . .
DATA test;
INPUT v1 v2 v3 v4 v5 v6 v7;
DATALINES;
0.13 . . . . . .
0.21 0.30 . . . . .
0.31 0.52 0.79 . . . .
0.05 0.11 0.25 0.18 . . .
0.77 0.93 0.81 0.51 0.02 . .
0.96 0.09 0.45 0.36 0.14 0.29 .
0.55 0.67 0.71 0.92 0.44 0.38 0.01
RUN;
获取每行的最大值:
DATA test;
SET test;
rowmax = max(v1,v2,v3,v4,v5,v6,v7);
RUN;
然后,转置数据集:
PROC TRANSPOSE DATA=test OUT=test PREFIX=v;
RUN;
现在,获取列的最大值:
DATA test;
SET test;
colmax = max(v1,v2,v3,v4,v5,v6,v7);
RUN;
将其修复回原始方向:
PROC TRANSPOSE DATA=test OUT=test;
ID _NAME_;
RUN;
最后,删除一个不必要的值:
DATA test;
SET test;
IF _N_=8 THEN rowmax=.;
RUN;
和打印以显示数据结构:
PROC PRINT DATA=test;
RUN;
这将为您提供以下输出:
_NAME_ v1 v2 v3 v4 v5 v6 v7 rowmax
v1 0.13 . . . . . . 0.13
v2 0.21 0.30 . . . . . 0.30
v3 0.31 0.52 0.79 . . . . 0.79
v4 0.05 0.11 0.25 0.18 . . . 0.25
v5 0.77 0.93 0.81 0.51 0.02 . . 0.93
v6 0.96 0.09 0.45 0.36 0.14 0.29 . 0.96
v7 0.55 0.67 0.71 0.92 0.44 0.38 0.01 0.92
colmax 0.96 0.93 0.81 0.92 0.44 0.38 0.01 .
剩下的唯一部分是逻辑(因此,7列中的哪一列包含所有列中最大的值,7行中的哪一行包含所有行中最大的值)。然后,你可以这样做。首先确定要归零填充的列:
DATA test;
SET test;
index=_N_;
ARRAY v v1-v7;
IF _N_=8 THEN DO i=1 TO 7;
IF v[i]=max(v1,v2,v3,v4,v5,v6,v7) THEN DO;
CALL SYMPUT('rightcol',i);
END;
END;
IF _N_~=8 THEN v["&rightcol"]=0;
DROP i;
RUN;
现在,要获取行,只需对数据集进行排序(这就是我在上面设置索引的原因)
现在,只需执行N=1的操作,就可以将该行的填充量归零
并对集合重新排序:
PROC SORT DATA=test;
BY index;
RUN;
最终您将得到以下输出:
_NAME_ v1 v2 v3 v4 v5 v6 v7 rowmax index
v1 0.00 . . . . . . 0.13 1
v2 0.00 0.30 . . . . . 0.30 2
v3 0.00 0.52 0.79 . . . . 0.79 3
v4 0.00 0.11 0.25 0.18 . . . 0.25 4
v5 0.00 0.93 0.81 0.51 0.02 . . 0.93 5
v6 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.96 6
v7 0.00 0.67 0.71 0.92 0.44 0.38 0.01 0.92 7
colmax 0.96 0.93 0.81 0.92 0.44 0.38 0.01 . 8
如果需要迭代,只需调整代码即可擦除colmax和rowmax中的值。欢迎使用堆栈溢出!请添加一个小的示例数据集,以准确说明您想要做什么。前后图像会有所帮助。您是使用SAS-IML,还是仅使用基本SAS?当您说行和列时,您的意思是找到两者最高值出现的奇异交点,还是指独立计算出哪一行的值最高,哪一列的值最高(分别在所有行或所有列中)?此外,我需要矩阵最大值出现的行和列。因此,是的,它需要在所有行和列中。然后我可以用0或一个较大的负数替换整个行和列,并重复该函数。这很好,但我确实需要列和行来计算统计数据,然后我就可以输入将列和行值转换为矩阵命令,如:
sigma\u split[row,column]=0
其中sigma_split是我试图找到最大值出现位置的矩阵。另外,我同意你的观点,这在R中要容易得多。R中与我想要的平行的代码是这个x。mYou可能能够使用多维数组来完成这一点。我对SAS技能有点生疏,现在我在工作中被甩了,b但如果我有机会,我会看看我能不能搞糟它。。。
PROC SORT DATA=test;
BY index;
RUN;
_NAME_ v1 v2 v3 v4 v5 v6 v7 rowmax index
v1 0.00 . . . . . . 0.13 1
v2 0.00 0.30 . . . . . 0.30 2
v3 0.00 0.52 0.79 . . . . 0.79 3
v4 0.00 0.11 0.25 0.18 . . . 0.25 4
v5 0.00 0.93 0.81 0.51 0.02 . . 0.93 5
v6 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.96 6
v7 0.00 0.67 0.71 0.92 0.44 0.38 0.01 0.92 7
colmax 0.96 0.93 0.81 0.92 0.44 0.38 0.01 . 8