2013-07-17 80 views
1

我有2組變量之間的相關矩陣。 我想找到與每個最大相關性R適用奇怪的行爲與NA

> B = data.frame('B1' = c(3,3,5), 'B2' = c(2,7,8)) 
> A = data.frame('A1' = c(1,2,3), 'A2' = c(4,2,6)) 
> corr_matrix = cor(A,B) 
> corr_matrix 

      B1  B2 
A1 0.8660254 0.9332565 
A2 0.8660254 0.1555428 

變量B我跑

> temp = apply(corr_matrix,1,which.max) 
> temp 
A1 A2 
2 1 
> names(B)[temp] 
[1] "B2" "B1" 

,並得到什麼,我需要一個很好的載體。繼承人。如果我的矩陣看起來像這樣

corr_matrix 

      B1 B2  B3 
A1   NA NA  NA 
A2 0.3986434 NA 0.2807630 
A3 -0.3568664 NA 0.6037172 
A4 0.1974342 NA 0.6827092 

apply(corr_matrix,1,which.max) 

$A1 
integer(0) 

$A2 
B1 
1 

$A3 
B3 
3 

$A4 
B3 
3 

我得到一個奇怪的嵌套結構,我不是特別明白。有人能解釋一下這個結構是什麼,以及它爲什麼與上面的例子有所不同?

我的意思是我會很高興,如果它吐出來

A1 A2 A3 A4 
NA 1 3 3 

所有的最後,我可以看到我想要的答案(NA,B1,B3,B3),但我怎麼把它弄出來的矢量形式?

我看到很多NA +應用線程,但它們都沒有用於我的目的,所以我很抱歉如果這是我不知道的東西的重複。

回答

3

相關矩陣:

corr_matrix <- as.matrix(read.table(text = "B1 B2  B3 
          A1   NA NA  NA 
          A2 0.3986434 NA 0.2807630 
          A3 -0.3568664 NA 0.6037172 
          A4 0.1974342 NA 0.6827092", header = TRUE, row.names = 1)) 

您可以定義一個函數來處理的情況下,所有值都NA

temp <- apply(corr_matrix,1, function(x) if (all(is.na(x))) NA else which.max(x)) 

temp 
# A1 A2 A3 A4 
# NA 1 3 3 

names(B)[temp] 
# [1] NA "B1" "B3" "B3" 
+0

非常感謝,這是真正有用的。你是否也能夠解釋奇怪的嵌套結構是什麼,以及如果我再次遇到它,我將如何處理? – hjw

+0

@hjw整數(0)是一個長度爲0的整數向量。有關更多信息,請看Arun的答案。 –

1

斯文的解決方案是在一般的路要走。但是,對於這種情況下,你可以通過改變你的輸出列表的modenumeric脫身:

ll <- structure(list(A1 = integer(0), A2 = structure(1L, .Names = "B1"), 
     A3 = structure(3L, .Names = "B3"), A4 = structure(3L, .Names = "B3")), 
    .Names = c("A1", "A2", "A3", "A4")) 

mode(ll) <- "numeric" 
ll 
# A1 A2 A3 A4 
# NA 1 3 3 
+0

+1非常感謝!不幸的是,我不能接受這兩個答案 – hjw