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