我想用ddply
(package plyr)和cor来计算由因子(“Plot”)分割的Pearson相关性。当列作为列名传递给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
使用ddply
和cor
以及数据框的列名:
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
请注意,每一行都显示唯一的相关值。以上是我想要的。
使用ddply
和cor
以及数据框的列号:
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分割。
由于
答案 0 :(得分: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"))
更新以下评论
在上面的例子中,cor被提供两个数字向量,' 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"))