【问题标题】:How to get a correlation matrix from a pairwise correlation data.frame?如何从成对相关data.frame中获取相关矩阵?
【发布时间】:2019-10-20 21:44:48
【问题描述】:

我有一个成对的相关数据框,看起来像这样(这只是头部):

      var1                var2  corr
1  OTU3978 UniRef90_A0A010P3Z8 0.846
2  OTU4011 UniRef90_A0A010P3Z8 0.855
3  OTU4929 UniRef90_A0A010P3Z8 0.829
4  OTU4317 UniRef90_A0A011P550 0.850
5  OTU4816 UniRef90_A0A011P550 0.807
6  OTU3902 UniRef90_A0A011QPQ2 0.836
7  OTU3339 UniRef90_A0A011RKI6 0.835
8  OTU1359 UniRef90_A0A011RLA7 0.801
9  OTU2085 UniRef90_A0A011RLA7 0.843
10 OTU3542 UniRef90_A0A011RLA7 0.866

我想从此数据框中获取相关矩阵 我试过了:

library(igraph)
G <- graph.data.frame(df,directed=FALSE)
A <-as_adjacency_matrix(G,names=TRUE,sparse=FALSE,attr="corr",type='lower')

但是没有用。

【问题讨论】:

  • 实际上,它并没有返回相关矩阵。根据我在帖子中显示的 data.frame,我应该得到很多 NA(因为并非所有变量都相互关联)。
  • 但是你的想法不是你试图从 $corr 向量中得到一个相关矩阵吗?
  • 真的!但实际上,我不知道我是否应该得到一个 10 行 (var1) x 10 列 (var2) 矩阵?还是 15 x 15 矩阵(因为我的 data.frame 中有 15 个不同的变量)?在这两种情况下,我都会得到很多 NA 并将其转换为 0 ?
  • 所以你有比这两个更多的变量?它们之间是否也有相关性数据?
  • 其实,nrow(df)=1105854 。但并非所有变量都彼此不相关(例如,OTU3978 可能仅与 UniRef90_A0A010P3Z8 相关,但 UniRef90_A0A010P3Z8 可能与此 OTU 或许多其他 OTU 相关,反之亦然) .而var1只对应OTUXXX,var2对应UniRef90_XXX

标签: r dataframe matrix igraph correlation


【解决方案1】:

有几种方法可以做到这一点。一种方法是您提到的acast,但您也可以使用tidyr中的spread

library(tidyr)

var1 <- c("A", "B", "C", "D")
var2 <- c("E", "E", "F", "F")
corr <- c(0.2, 0.3, 0.4, 0.5)
df <- data.frame(var1, var2, corr)
df
  var1 var2 corr
1    A    E  0.2
2    B    E  0.3
3    C    F  0.4
4    D    F  0.5
df <- spread(df, var2, corr)
df
  var1   E   F
1    A 0.2  NA
2    B 0.3  NA
3    C  NA 0.4
4    D  NA 0.5

【讨论】:

  • 它也适用于 tidyr 库,谢谢。你知道是否可以将所有变量都作为行和列?我的意思是,不仅将 OTUXXX 变量放在行中,将 Uniref90_XXX 放在列中(或者相反,无论如何),而且将两个变量(所有 OTUXXX 和 Uniref90_XXX)放在行和列中?
  • 但是由于没有 OTUXXX 与 OTUXXX 的更正数据,这些都将显示为 NA?这就是你所追求的吗?我可能会在原始 var1 和 var2 列中添加所有值。
  • 无论如何,我会将 NA 更改为 0 。只是以后尝试一下。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-20
  • 2021-02-13
相关资源
最近更新 更多