如何保存sas中出现最大值的列和行值

如何保存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 . . . .

我需要找到最大值出现在下三角协方差矩阵中的行和列。然后,我可以用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 . . . .
    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