R - 矩阵中非对角线元素的最小值,最大值和平均值

amh*_*mad 8 r sum mean

我喜欢R中的矩阵,我希望得到:

Max off - diagonal elements
Min off – diagonal elements
Mean off –diagonal elements
Run Code Online (Sandbox Code Playgroud)

用对角线我用max(diag(A)),min(diag(A)),mean(diag(A))并且工作得很好

但对于非对角线我尝试过

dataD <- subset(A, V1!=V2)

Error in subset.matrix(A, V1 != V2) : object 'V1' not found
Run Code Online (Sandbox Code Playgroud)

使用:

colMeans(dataD) # get the mean for columns
Run Code Online (Sandbox Code Playgroud)

但我无法得到dataD b/c它说没有找到对象'V1'

谢谢!

Rei*_*son 23

这里row()col()辅助函数很有用.使用@James A,我们可以使用这个小技巧获得上面的对角线:

> A[row(A) == (col(A) - 1)]
[1]  5 10 15
Run Code Online (Sandbox Code Playgroud)

通过这个下方的对角线:

> A[row(A) == (col(A) + 1)]
[1]  2  7 12
Run Code Online (Sandbox Code Playgroud)

这些可以推广给你想要的任何对角线:

> A[row(A) == (col(A) - 2)]
[1]  9 14
Run Code Online (Sandbox Code Playgroud)

并且不需要任何子集.

然后,在这些值上调用您想要的任何函数是一件简单的事情.例如:

> mean(A[row(A) == (col(A) - 1)])
[1] 10
Run Code Online (Sandbox Code Playgroud)

如果根据我的评论你的意思是除了对角线之外的所有东西,那就用吧

> diag(A) <- NA
> mean(A, na.rm = TRUE)
[1] 8.5
> max(A, na.rm = TRUE)
[1] 15
> # etc. using sum(A, na.rm = TRUE), min(A, na.rm = TRUE), etc..
Run Code Online (Sandbox Code Playgroud)

因此,这不会丢失,本Bolker建议(在评论),上面的代码块能更加整齐使用来完成row()col()我上面提到的功能:

mean(A[row(A)!=col(A)])
min(A[row(A)!=col(A)])
max(A[row(A)!=col(A)])
sum(A[row(A)!=col(A)])
Run Code Online (Sandbox Code Playgroud)

这是一个更好的解决方案.

  • 或'意思是(A [行(A)!= col(A)])`等 (3认同)

B M*_*der 5

在一个简单的代码行中:

对于一个矩阵A,如果你想找到的最小,第一个四分位,中位值,平均值,第三个四分位数和最大的鞋面降低过对角线:

summary(c(A[upper.tri(A)],A[lower.tri(A)])).