我喜欢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,如果你想找到的最小,第一个四分位,中位值,平均值,第三个四分位数和最大的鞋面和降低过对角线:
summary(c(A[upper.tri(A)],A[lower.tri(A)]))
.