Я использую только 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
, которая возвращает вам непосредственно 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
работает быстрее, чем два других решения. Нашли ли вы решение?
Буду рад видеть ваше предложение, потому что это интересный вопрос.