我正在尝试编写一些代码来轻松计算矩阵中所有连续列之间的相关性。
我们假设我有A,B,C,D,E列。
我想要成对相关AB,BC,CD,DE。
为了避免写一个循环,到目前为止,我已经开始玩耍,但不是很成功。
我很感激任何支持。
答案 0 :(得分:2)
您可以利用cor
自动计算所有列相关关系的事实:
cor(df)[cbind(2:ncol(df), 1:(ncol(df) - 1))]
# [1] -0.08727070 -0.10444715 0.06008165 0.18030921
比较:
cor(df$a, df$b)
# [1] -0.0872707
cor(df$b, df$c)
# [1] -0.1044471
这里,我们计算完全相关矩阵,然后计算子集以获得超对角线(对角线从实际对角线向上移动一个),这对应于第1-2,2-3等的相关性。我们使用由cbind
创建的矩阵进行子集,该矩阵指定了所有超对角线坐标。
以下是我生成数据的方式:
set.seed(123)
df <- as.data.frame(replicate(5, runif(100), s=F))
names(df) <- letters[1:ncol(df)]
答案 1 :(得分:1)
真的没有必要重新发明轮子。使用corrplot
包:
require(corrplot)
data(mtcars)
M <- cor(mtcars)
corrplot(M, order ="AOE", addCoef.col="gray40")
corrplot(M, order="AOE",method="ellips", col="grey", cl.pos="n",addCoef.col="yellow")
安装包:
install.packages("corrplot")
答案 2 :(得分:1)
让我们重新发明,呵呵。
AAA&LT; -data.frame(A = runif(10)中,b = runif(10)中,c = runif(10)中,d = runif(10)中,e = runif(10))
diag(cor(aaa [,1:(dim(aaa)[2] -1)],aaa [,2:(dim(aaa)[2])]))
答案 3 :(得分:1)
如果您需要sapply
:
set.seed(1)
df <- data.frame(a=runif(100), b=runif(100), c=runif(100), d=runif(100))
sapply(1:(ncol(df)-1), function(x) cor(df[x], df[x+1]))
# [1] 0.017032146 0.009675918 0.103959503
答案 4 :(得分:1)
循环并不总是坏的 - 特别是如果您事先知道结果向量应该有多大,那么填写它。
set.seed(1)
mat <- matrix(rnorm(50), nrow=10, ncol=5)
succ.cor <- function(x){
n <- ncol(x)
col1 <- seq(n)[-n]
col2 <- seq(n)[-1]
res <- seq(col1)
for(i in seq(res)){
res[i] <- cor(x[,col1[i]], x[,col2[i]])
}
res
}
succ.cor(mat)
#[1] -0.37670337 0.60402733 0.08296412 0.34192416
这里有一个更好的速度比较:
set.seed(1)
m=3000
n=1000
A <- as.data.frame(matrix(rnorm(m*n), m, n))
#lukeA
t1 <- Sys.time()
tmp1 <- sapply(1:(ncol(A)-1), function(x) cor(A[x], A[x+1]))
lukeA.diff <- Sys.time() - t1
lukeA.diff
#Rufo
t1 <- Sys.time()
tmp2 <- diag(cor(A[,1:(dim(A)[2]-1)], A[,2:(dim(A)[2])]))
Rufo.diff <- Sys.time() - t1
Rufo.diff
#Marc in the box
t1 <- Sys.time()
tmp3 <- succ.cor(A)
Marcinthebox.diff <- Sys.time() - t1
Marcinthebox.diff
#BrodieG
t1 <- Sys.time()
tmp4 <- cor(A)[cbind(2:ncol(A), 1:(ncol(A) - 1))]
BrodieG.diff <- Sys.time() - t1
BrodieG.diff
#Jilber (from http://stackoverflow.com/a/18535544/1199289)
t1 <- Sys.time()
tmp5 <- mapply(cor, A[,1:(dim(A)[2]-1)], A[,2:(dim(A)[2])])
Jilber.diff <- Sys.time() - t1
Jilber.diff
t(data.frame(Jilber.diff, Marcinthebox.diff, lukeA.diff, BrodieG.diff, Rufo.diff))
Jilber.diff "0.2349489 secs"
Marcinthebox.diff "0.2255359 secs"
lukeA.diff "0.408231 secs"
BrodieG.diff "6.042533 secs"
Rufo.diff "12.20104 secs"
所以似乎mapply
方法也很快。 lukeA和我的......以及