outer
не напрямую зависит от работы.Он просто расширит свои X
и Y
векторы и вызовет cor
один раз. РЕДАКТИРОВАТЬ Как показывает @Vincent Zoonekynd, вы можете адаптировать его к работе.
В противном случае довольно простой цикл делает свое дело:
m <- as.matrix(mtcars)
r <- matrix(1, ncol(m), ncol(m), dimnames=list(colnames(m), colnames(m)))
for(i in 1:(ncol(m)-1)) {
for(j in (i+1):ncol(m)) {
r[i,j] <- cor(m[,i], m[,j])
r[j,i] <- r[i,j]
}
}
all.equal(r, cor(m)) # Sanity check...
r # print resulting 11x11 correlation matrix
... Вот яПредположим, что ваша корреляция симметрична, и cor (x, x) == 1
.
ОБНОВЛЕНИЕ Поскольку решение Винсента гораздо более элегантно, мне приходится противостоять тому факту, что мое решениеВ 2 раза быстрее: -)
# Huge data frame (1e6 rows, 10 cols)
d <- data.frame(matrix(1:1e7, ncol=10))
# Vincent's solution
system.time(outer(
names(d),
names(d),
r <- Vectorize(function(i,j) cor(d[,i],d[,j]))
)) # 2.25 secs
# My solution
system.time({
m <- d
r <- matrix(1, ncol(m), ncol(m), dimnames=list(colnames(m), colnames(m)))
for(i in 1:(ncol(m)-1)) {
for(j in (i+1):ncol(m)) {
r[i,j] <- cor(m[,i], m[,j])
r[j,i] <- r[i,j]
}
}
}) # 1.0 secs