从Corr矩阵返回最大相关和行名称

时间:2016-03-04 20:35:31

标签: r matrix correlation

我正在尝试使用data.frame函数找到cor对象的每列中的最大相关性。假设这个对象看起来像

A <- rnorm(100,5,1)
B <- rnorm(100,6,1)
C <- rnorm(100,7,4)
D <- rnorm(100,4,2)
E <- rnorm(100,4,3)


M <- data.frame(A,B,C,D,E)
N <- cor(M)

相关矩阵看起来像

>N

             A           B            C            D            E
A  1.000000000  0.02676645  0.000462529  0.026875495 -0.054506842
B  0.026766455  1.00000000 -0.150622473  0.037911600 -0.071794930
C  0.000462529 -0.15062247  1.000000000  0.015170017  0.026090225
D  0.026875495  0.03791160  0.015170017  1.000000000 -0.001968634
E -0.054506842 -0.07179493  0.026090225 -0.001968634  1.000000000

在第一列(A)的情况下,我希望R向我返回值“D”,因为它是A列中的最大非负,非“1”值,以及它的关联相关性

有什么想法吗?

3 个答案:

答案 0 :(得分:4)

另一种选择:

library(data.table)
setDT(melt(N))[Var1 != Var2, .SD[which.max(value)], keyby=Var1]

@ cory的数据结果(使用set.seed(9)):

   Var1 Var2      value
1:    A    D 0.28933634
2:    B    C 0.13483843
3:    C    B 0.13483843
4:    D    A 0.28933634
5:    E    C 0.02588474

要了解其工作原理,请先尝试运行melt(N),然后将数据放入长格式。

答案 1 :(得分:3)

列号为

(n <- max.col(`diag<-`(N,0)))
# [1] 4 4 5 2 3

名称是

colnames(N)[n]
# [1] "D" "D" "E" "B" "C"

值为

N[cbind(seq_len(nrow(N)),n)]
# [1] 0.02687549 0.03791160 0.02609023 0.03791160 0.02609023

答案 2 :(得分:1)

对行使用apply以获取小于1的值的最大行数。然后使用which获取列索引,然后使用colNames获取实际字母...

set.seed(9)
A <- rnorm(100,5,1)
B <- rnorm(100,6,1)
C <- rnorm(100,7,4)
D <- rnorm(100,4,2)
E <- rnorm(100,4,3)

M <- data.frame(A,B,C,D,E)
N <- cor(M)

N
            A            B           C           D           E
A 1.000000000  0.005865532  0.03595202  0.28933634  0.00795076
B 0.005865532  1.000000000  0.13483843  0.04252079 -0.09567275
C 0.035952017  0.134838434  1.00000000 -0.01160411  0.02588474
D 0.289336335  0.042520787 -0.01160411  1.00000000 -0.12054680
E 0.007950760 -0.095672747  0.02588474 -0.12054680  1.00000000

colnames(N)[apply(N, 1, function (x) which(x==max(x[x<1])))]
[1] "D" "C" "B" "A" "C"