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
。
UPDATE由於文森特的解決方案是如此優雅得多,我有一個事實,即我的是快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
這兩個都是非常棒的點子。非常感謝你們。 +1 – 2012-03-29 00:12:04
+1,適合使用'Vectorize'。 – Tommy 2012-03-29 00:14:28