我正在尝试使用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”值,以及它的关联相关性
有什么想法吗?
答案 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"