2016-05-29 81 views
0

任何與以下問題的幫助將不勝感激;行之間的皮爾遜係數R

我正在嘗試使用R來查找1個特定數據行與數據集中每個其他行(單獨)之間的皮爾遜係數,以確定哪些行與感興趣的行有顯着相關性。數據幀由20列和50,000行組成,數據本身由數字值組成。 是否可以用cor.test或其他適當的函數來實現這一點?

回答

2

首先,我建議將輸入對象重新格式化爲矩陣而不是data.frame。

您可以使用apply()遍歷矩陣的所有行,並在當前行和感興趣的行之間運行cor()。這將產生相關性的向量。

在下面的代碼中,我生成一個隨機矩陣m 20列和50,000行,並存儲在ri感興趣的行。然後,我們可以調用apply()帶有行邊距(即MARGIN=1L)在每行上針對感興趣的行m[ri,]調用cor()

您可以選擇包含或排除迭代感興趣的行。在我的代碼示例中,我將它包括在內,這導致元素在結果向量res中的索引ri處保證具有值1。這個選擇的一個好的副作用是結果向量長度爲​​50,000,與輸入矩陣中的行數相同,因此索引將對齊。如果您選擇排除它,可以通過將m[-ri,]傳遞給apply()調用而不是m來完成,結果向量將具有長度49,999,並且其元素將不再與輸入矩陣的行對齊。

NR <- 50e3L; NC <- 20L; m <- matrix(runif(NR*NC),NR); 
ri <- 2L; res <- apply(m,1L,cor,m[ri,]); 
str(res); 
## num [1:50000] -0.074 1 0.201 -0.0467 0.2097 ... 
summary(res); 
##  Min. 1st Qu. Median  Mean 3rd Qu.  Max. 
## -0.806700 -0.158500 0.001143 0.001114 0.160800 1.000000 

您可以cor.test()替代cor()獲得由後者提供的附加信息,但在稍長的運行時間爲代價的,更復雜的結果對象(一個列表,而不是原子向量)。

+0

非常感謝你這個工程。你可能會建議我如何將結果輸出到Excel表格中?我曾嘗試使用像pvalues < - res $ p.value,res $「p.value」等東西,並不斷收到NULL消息。 – user5688971

+0

如果你問如何從'cor.test()'結果列表中提取P值,你可以使用'pvalues < - sapply(res,'[[','p.value')''。如果您問如何將數據從R導出到Excel,那麼我會推薦一個[Google搜索](https://www.google.ca/search?q=export+r+to+excel)。如果沒有Google結果適用於您的用例,我會建議在堆棧溢出問一個新問題。 – bgoldst

+0

謝謝你,完美的作品 – user5688971

1

另一種解決方案是先將您的data.frame轉置,然後您可以使用相關圖來顯示相關性。

# transpose data 
    df2 <- data.frame(t(df)) 


# Example of a correlogram using the `mtcars` dataset: 
    library(corrgram) 

    corrgram(mtcars, order=NULL, lower.panel=panel.shade, 
      upper.panel=NULL, text.panel=panel.txt, 
      main="your correlogram") 

enter image description here