2016-03-04 29 views
1

我試圖通過使用cor函數找到data.frame對象的每個列中的最大相關性。比方說,這個物體看起來像從Corr矩陣返回最大相關性和行名稱

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

另一種選擇:

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

結果與@科裏的數據(使用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),它將數據置於長格式。

+0

我發佈的示例是我正在使用的251-特徵相關矩陣的一般形式。你能否給我一個關於如何改變'Var1!= Var2'的建議,以產生dims ==(251,3)的輸出? – d8aninja

+0

@ D8Amonk當你說251個特徵時,你的意思是M有251個列嗎?如果是這樣,我猜這個代碼應該仍然有效。不過,您必須首先安裝package('data.table')。 – Frank

+0

我這樣做。當我運行該代碼時,我得到'eval(expr,envir,enclos)中的錯誤:object'Var1'not found' – d8aninja

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 
+0

你能解釋一下'diag <-'部分正在做什麼? – d8aninja

+0

清零矩陣的對角線。它與'diag(N)< - 0'相同,但返回一個變異副本而不是變異原始。 –

+0

你可以把它看作'N2 < - N; diag(N2)< - 0;回報(N2)'。 –

1

對行使用apply獲得該行的對數值的最大值小於一。然後使用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" 
相關問題