我喜欢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'找不到
谢谢!
答案 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)])