2013-11-10 15 views
1

我想使用帶有cor的ddply(package plyr)來計算按因子(「Plot」)分割的Pearson相關性。當列作爲列名傳遞給cor時,我可以成功地做到這一點,但當通過列號傳遞時,我可以成功地做到這一點。使用帶有多個數據幀列的plyr和cor

日期幀:

 head(chlor2013.df) 

    Plot X645 X665 Chlorophyll 
1 1 0.019 0.054  0.3647 
2 1 0.061 0.170  1.1588 
3 1 0.021 0.054  0.3827 
4 2 0.033 0.092  0.6270 
5 2 0.055 0.148  1.0259 
6 2 0.018 0.045  0.3234 

使用ddplycor,以及該數據幀的列名:

ddply(chlor2013.df, .(Plot), summarize, cor.v2.v3 = cor(X645,X665, use="complete.obs")) 

    Plot cor.v2.v3 
1 1 0.9610698 
2 2 0.9261662 
3 3 0.9191197 
4 4 0.9104561 
5 5 0.9541877 
6 6 0.8750801 
7 7 0.9949413 

請注意,每個行示出了獨特的相關值。以上是我想要的。

使用ddplycor,以及列中的數據幀的數目:

ddply(chlor2013.df, .(Plot), summarize, cor.v2.v3 = cor(chlor2013.df[2:3], 
use="complete.obs")) 

Plot cor.v2.v3.1 cor.v2.v3.2 
1  1 1.0000000 0.9698445 
2  1 0.9698445 1.0000000 
3  2 1.0000000 0.9698445 
4  2 0.9698445 1.0000000 
5  3 1.0000000 0.9698445 
6  3 0.9698445 1.0000000 
7  4 1.0000000 0.9698445 
8  4 0.9698445 1.0000000 
9  5 1.0000000 0.9698445 
10 5 0.9698445 1.0000000 
11 6 1.0000000 0.9698445 
12 6 0.9698445 1.0000000 
13 7 1.0000000 0.9698445 

現在,所有r值是相同的,並代表當沒有由因子分裂兩列的相關性。所以列號語法與列名稱語法不同。我錯過了什麼?最終,我想計算所有三個變量的相關矩陣:X645,X665和葉綠素,按Plot分割。

感謝

回答

3

您需要使用匿名函數是指「chlor2013.df」的每個子集。在您的初始嘗試中,在「繪圖」的每個級別的所有計算中使用了相同的數據集chlor2013.df[2:3]。還要注意的是cor(df[2:3])是不一樣的cor(df[2], df[3])(與你的第一個電話比較:cor(X645,X665

ddply(df, .(Plot), function(x) cor.v2.v3 = cor(x[2], x[3], use = "complete.obs")) 

更新如下評論
在上面的例子中,肺被送到兩個數值向量,「X645」和'X665'。您也可以使用數字矩陣或數據框作爲輸入來創建「多元樣本的相關矩陣」(請參閱​​?cor,例如cor(longley))。

# refering to variables by index 
ddply(df, .(Plot), function(x) cor.v2.v3 = cor(x[2:4], use = "complete.obs")) 

# refering to variables by name (better practice) 
ddply(df, .(Plot), function(x) cor.v2.v3 = cor(x[ , c("X645", "X665", "Chlorophyll")], use = "complete.obs")) 
+0

我明白了,謝謝你幫助我理解! – prefectionist

+0

所以這適用於計算兩列的r,但爲什麼不能超過兩? – prefectionist

+0

@prefectionist,我已經更新了我的答案。 – Henrik

相關問題