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

时间:2012-10-24 12:49:35

标签: r sum mean

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

Max off - diagonal elements
Min off – diagonal elements
Mean off –diagonal elements

使用对角线我使用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

使用:

colMeans(dataD) # get the mean for columns

但是我无法获得dataD b / c它说对象'V1'找不到

谢谢!

6 个答案:

答案 0 :(得分:20)

此处row()col()辅助函数非常有用。使用@James A,我们可以使用这个小技巧获得上部非对角线:

> A[row(A) == (col(A) - 1)]
[1]  5 10 15
通过这个

和更低的对角线:

> A[row(A) == (col(A) + 1)]
[1]  2  7 12

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

> A[row(A) == (col(A) - 2)]
[1]  9 14

并且不需要任何子集。

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

> mean(A[row(A) == (col(A) - 1)])
[1] 10

如果根据我的评论,你的意思是除了对角线以外的所有内容,请使用

> 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..

所以这不会迷失,Ben 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)])

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

答案 1 :(得分:5)

在一行简单的代码中:

对于矩阵A,如果您希望找到上部的最小,第一四分位数,中位数,平均值,第三四分位数和最大值 降低对角线:

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

答案 2 :(得分:2)

适当子集化矩阵的diag将为您提供非对角线。例如:

A <- matrix(1:16,4)
#upper off-diagonal
diag(A[-4,-1])
[1]  5 10 15
#lower off-diagonal
diag(A[-1,-4])
[1]  2  7 12

答案 3 :(得分:1)

要获得一个向量,其中包含矩阵的每个列或行的非对角线元素的最大值,需要更多步骤。在寻找帮助时我被引导到这里。也许其他人会这样做,所以我提供这个解决方案,我用我在这里学到的东西找到了。

诀窍是创建一个只有非对角线元素的矩阵。考虑:

> A <- matrix(c(10,2,3, 4,10,6, 7,8,10), ncol=3)
> A
     [,1] [,2] [,3]
[1,]   10    4    7
[2,]    2   10    8
[3,]    3    6   10
> apply(A, 2, max)
[1] 10 10 10

使用建议的索引进行子集化,A[row(A)!=col(A)]按列顺序生成非对角线元素的向量:

> v <- A[row(A)!=col(A)]
> v
[1] 2 3 4 6 7 8

将此返回到矩阵允许使用apply()将选择函数应用于仅非对角线元素的边距。以max函数为例:

> A.off <- matrix(v, ncol=3)
> A.off
     [,1] [,2] [,3]
[1,]    2    4    7
[2,]    3    6    8
> v <- apply(A.off, 2, max)
> v
[1] 3 6 8

整个操作可以在一行中紧凑地进行密码编码:

> v <- apply(matrix(A[row(A)!=col(A)], ncol=ncol(A)), 2, max)
> v
[1] 3 6 8

答案 4 :(得分:0)

将矩阵A乘以1-diag(nofelements)

例如,如果A是4x4矩阵,那么

平均值(A *(1-diag(4))或A *(1-diag(nrow(A)))

当您需要多次运行相同的代码行时,这会更快

答案 5 :(得分:-1)

除了James的回答之外,我想补充一点,您可以使用diag函数通过A[-diag(A)]直接排除矩阵的所有对角元素。例如,考虑: summary(A[-diag(A)])