【问题标题】:melt correlation matrix in RR中的融化相关矩阵
【发布时间】:2018-08-08 14:44:10
【问题描述】:

我在 R 中使用以下方法创建了一个相关矩阵:

cor(df, use = "p")->df_corr

然后我使用以下方法熔化矩阵:

melt(df_corr) -> df_corr_melted

得到:

Var1 Var2 value
A    B    .1
A    C     .2
A    A     1
B    A     .1
B    C     .4
B    B     1
C    A     .2
C    B     .4
C    C     1

我想删除冗余对。例如,我只需要 corr(A,C) 而不是 corr(C,A)。我通读了 dplyr 中的过滤命令,但由于行组合实际上是唯一的,因此这些不是真正的重复。有什么建议?

【问题讨论】:

  • 子集(filter 和 dplyr)其中 Var1 <= Var2。如果您还想省略琐碎的 X、X 相关性,请使用 < 而不是 <=。
  • @Gregor,很好的答案。

标签: r matrix duplicates dplyr correlation


【解决方案1】:

您可以使用replace 将矩阵的对角线和上三角或下三角设置为NA,然后只需melt(..., na.rm = TRUE),即可一次性完成:

演示:

library(reshape2)
melt(replace(df_corr, lower.tri(df_corr, TRUE), NA), na.rm = TRUE)
#   Var1 Var2      value
# 4   aa   bb  0.5776151
# 7   aa   cc -0.4059593
# 8   bb   cc -0.5673487

样本数据:

set.seed(123)
df_corr <- cor(data.frame(aa = rnorm(10), bb = rnorm(10), cc = rnorm(10)), use = "p")

【讨论】:

    【解决方案2】:

    在融化之前你可以这样做:

    data.frame(Var1=t(combn(colnames(df_corr),2)),Var2=df_corr[lower.tri(df_corr)])
    

    【讨论】:

      【解决方案3】:

      这是一种使用combn 和apply 函数的方法:

      c_names <- combn(names(dat), 2)
      
      cors <- apply(c_names, 2, FUN = function(x) cor(dat[x[1]], dat[x[2]]))
      
      cbind.data.frame(t(c_names), cors)
      
         1  2       cors
      1 aa bb  0.5776151
      2 aa cc -0.4059593
      3 bb cc -0.5673487
      

      数据

      set.seed(123)
      dat <- data.frame(aa = rnorm(10),
                        bb = rnorm(10),
                        cc = rnorm(10))
      

      【讨论】:

        猜你喜欢
        • 2018-05-08
        • 2019-12-07
        • 1970-01-01
        • 1970-01-01
        • 2013-06-15
        • 1970-01-01
        • 2019-04-15
        • 1970-01-01
        • 2018-03-15
        相关资源
        最近更新 更多