【问题标题】:using plyr and cor with multiple data frame columns将 plyr 和 cor 与多个数据框列一起使用
【发布时间】:2013-11-21 23:31:54
【问题描述】:

我想将ddply(包 plyr)与 cor 一起使用来计算除以因子(“绘图”)的 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

使用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 分割。

谢谢

【问题讨论】:

    标签: r plyr


    【解决方案1】:

    您需要使用匿名函数引用“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"))
    

    【讨论】:

    • 所以这适用于计算两列的 r,但为什么不超过两列呢?
    猜你喜欢
    • 2015-03-16
    • 2018-01-27
    • 1970-01-01
    • 2021-05-04
    • 2016-05-12
    • 2018-11-22
    • 2021-04-25
    • 2019-10-17
    • 1970-01-01
    相关资源
    最近更新 更多