如何从矩阵中获取成对相关数据帧?
How to get a pariwise correlation dataframe from a matrix?
我有一个矩阵,用于计算列之间的相关性。我创建了一个以相关矩阵形式给出结果的函数(因为 apply()
函数),但我想直接获得成对相关数据帧。是否可以在没有任何中间矩阵的情况下做到这一点:矩阵 -> 成对相关数据帧
cor_rho<-function(y) {
res <- foreach(i = seq_len(ncol(y)),
.combine = rbind,
.multicombine = TRUE,
.inorder = FALSE,
.packages = c('data.table', 'doParallel')) %dopar% {
apply(y, 2, function(x) 1 - ((var(y[,i] - x)) / (var(y[,i]) + var(x))))}
return(res)}
这是相同的功能,我只是添加了一些行以获得我想要的data.frame
cor_rho<-function(y) {
res <- foreach(i = seq_len(ncol(y)),
.combine = rbind,
.multicombine = TRUE,
.inorder = FALSE,
.packages = c('data.table', 'doParallel')) %dopar% {
apply(y, 2, function(x) 1 - ((var(y[,i] - x)) / (var(y[,i]) + var(x))))}
colnames(res)=rownames(res)=colnames(y)
Df<-data.frame(var1=rownames(res)[row(res)[upper.tri(res)]],
var2=colnames(res)[col(res)[upper.tri(res)]],
corr=res[upper.tri(res)])
return(Df)}
这给了我这样的东西
var1 var2 value
var1 var3 value
var2 var3 value
我只使用 dplyr
和 reshape2
,它能满足您的需求吗?
library(reshape2)
library(dplyr)
set.seed(1)
n <- 10
df <- data.frame(var1 = rnorm(n), var2 = rnorm(n), var3 = rnorm(n))
melt(cor(df), id = c("Var1", "Var2")) %>%
filter(Var1 != Var2) %>%
filter(duplicated(value))
我做了一个可能会让你烦恼的假设,即假设相关系数和对称关系之间没有重复。希望对你有所帮助。
编辑 1:
我在网上查了一下,我找到了下面的包:corrr
其中他们是一个函数 correlate
其中 return 你直接一个 data.frame。如果你想要指定输出,下面几行给你一些接近:
install.packages('corrr')
library(corrr)
stretch(correlate(df))
但在那之后你需要像上面那样做同样的技巧才能得到你想要的。
编辑 2:
我在互联网上再次查看,看看有什么可以帮助你,事实上,唯一一个在输入中采用矩阵并在输出中给出 data.frame 的包是 corrr
,但我在更大的矩阵,它真的很慢。
n <- 100
p <- 8000
m <- n * p
df <- data.frame(matrix(rnorm(m), nrow = n, ncol = p))
t <- Sys.time()
m_cor <- cor(df)
t <- Sys.time() - t
t1 <- t
library(corrr)
t <- Sys.time()
m_cor <- correlate(df)
t <- Sys.time() - t
t2 <- t
library(propagate)
t <- Sys.time()
m_cor <- bigcor(df)
t <- Sys.time() - t
t3 <- t
而 propogate
似乎是处理非常大的矩阵的好方法,但我不确定是否能很好地理解输出的类型 ff
。在我的示例中,基本 cor
函数比其他两个解决方案更快。你找到任何解决方案了吗?
我很高兴看到你的提议,因为这是一个有趣的问题。
我有一个矩阵,用于计算列之间的相关性。我创建了一个以相关矩阵形式给出结果的函数(因为 apply()
函数),但我想直接获得成对相关数据帧。是否可以在没有任何中间矩阵的情况下做到这一点:矩阵 -> 成对相关数据帧
cor_rho<-function(y) {
res <- foreach(i = seq_len(ncol(y)),
.combine = rbind,
.multicombine = TRUE,
.inorder = FALSE,
.packages = c('data.table', 'doParallel')) %dopar% {
apply(y, 2, function(x) 1 - ((var(y[,i] - x)) / (var(y[,i]) + var(x))))}
return(res)}
这是相同的功能,我只是添加了一些行以获得我想要的data.frame
cor_rho<-function(y) {
res <- foreach(i = seq_len(ncol(y)),
.combine = rbind,
.multicombine = TRUE,
.inorder = FALSE,
.packages = c('data.table', 'doParallel')) %dopar% {
apply(y, 2, function(x) 1 - ((var(y[,i] - x)) / (var(y[,i]) + var(x))))}
colnames(res)=rownames(res)=colnames(y)
Df<-data.frame(var1=rownames(res)[row(res)[upper.tri(res)]],
var2=colnames(res)[col(res)[upper.tri(res)]],
corr=res[upper.tri(res)])
return(Df)}
这给了我这样的东西
var1 var2 value
var1 var3 value
var2 var3 value
我只使用 dplyr
和 reshape2
,它能满足您的需求吗?
library(reshape2)
library(dplyr)
set.seed(1)
n <- 10
df <- data.frame(var1 = rnorm(n), var2 = rnorm(n), var3 = rnorm(n))
melt(cor(df), id = c("Var1", "Var2")) %>%
filter(Var1 != Var2) %>%
filter(duplicated(value))
我做了一个可能会让你烦恼的假设,即假设相关系数和对称关系之间没有重复。希望对你有所帮助。
编辑 1:
我在网上查了一下,我找到了下面的包:corrr
其中他们是一个函数 correlate
其中 return 你直接一个 data.frame。如果你想要指定输出,下面几行给你一些接近:
install.packages('corrr')
library(corrr)
stretch(correlate(df))
但在那之后你需要像上面那样做同样的技巧才能得到你想要的。
编辑 2:
我在互联网上再次查看,看看有什么可以帮助你,事实上,唯一一个在输入中采用矩阵并在输出中给出 data.frame 的包是 corrr
,但我在更大的矩阵,它真的很慢。
n <- 100
p <- 8000
m <- n * p
df <- data.frame(matrix(rnorm(m), nrow = n, ncol = p))
t <- Sys.time()
m_cor <- cor(df)
t <- Sys.time() - t
t1 <- t
library(corrr)
t <- Sys.time()
m_cor <- correlate(df)
t <- Sys.time() - t
t2 <- t
library(propagate)
t <- Sys.time()
m_cor <- bigcor(df)
t <- Sys.time() - t
t3 <- t
而 propogate
似乎是处理非常大的矩阵的好方法,但我不确定是否能很好地理解输出的类型 ff
。在我的示例中,基本 cor
函数比其他两个解决方案更快。你找到任何解决方案了吗?
我很高兴看到你的提议,因为这是一个有趣的问题。