是的,R中的循环非常慢。但是我不知道如何在这样的代码中用* pply替换循环,其中每个矩阵单元都是针对所有其他单元格计算的。结果再次是矩阵:
for(i in 1:ncol(matrix)) {
for(j in 1:ncol(matrix)) {
result[i,j] <- function(set[i]),set[j]))
}
}
你能帮帮忙吗?
编辑:
矩阵看起来像这样:
A B C D E F
A 0 0 1 0 1 0
B 1 0 0 0 1 0
C 1 0 0 1 0 0
D 0 0 0 0 0 1
E 1 1 0 1 0 1
F 0 0 1 0 1 0
我想申请的功能是
getCosine <- function(x,y)
{
this.cosine <- sum(x*y) / (sqrt(sum(x*x)) * sqrt(sum(y*y)))
return(this.cosine)
}
在循环中它看起来像这样:
result[i,j] <- getCosine(as.matrix(a[i]), as.matrix(a[j]))
答案 0 :(得分:3)
假设您要查找每列与每列其他列之间角度的余弦,可以使用以下内容:
sapply(df, function(y) sapply(df,get.cos,y))
这是完整的代码。
df = read.table(h=T,row.names=1,text="
A B C D E F
A 0 0 1 0 1 0
B 1 0 0 0 1 0
C 1 0 0 1 0 0
D 0 0 0 0 0 1
E 1 1 0 1 0 1
F 0 0 1 0 1 0")
get.cos <- function(x,y) sum(x*y)/sqrt(sum(x*x)*sum(y*y))
# using loops
result.1 <- matrix(NA, nc=ncol(df),nr=nrow(df))
for(i in 1:ncol(df)) {
for(j in 1:ncol(df)) {
result.1[i,j] <- get.cos(df[,i],df[,j])
}
}
result.1
# [,1] [,2] [,3] [,4] [,5] [,6]
# [1,] 1.0000000 0.5773503 0.0000000 0.8164966 0.3333333 0.4082483
# [2,] 0.5773503 1.0000000 0.0000000 0.7071068 0.0000000 0.7071068
# [3,] 0.0000000 0.0000000 1.0000000 0.0000000 0.8164966 0.0000000
# [4,] 0.8164966 0.7071068 0.0000000 1.0000000 0.0000000 0.5000000
# [5,] 0.3333333 0.0000000 0.8164966 0.0000000 1.0000000 0.0000000
# [6,] 0.4082483 0.7071068 0.0000000 0.5000000 0.0000000 1.0000000
# using sapply(...)
result.2 <- sapply(df, function(y) sapply(df,get.cos,y))
result.2
# A B C D E F
# A 1.0000000 0.5773503 0.0000000 0.8164966 0.3333333 0.4082483
# B 0.5773503 1.0000000 0.0000000 0.7071068 0.0000000 0.7071068
# C 0.0000000 0.0000000 1.0000000 0.0000000 0.8164966 0.0000000
# D 0.8164966 0.7071068 0.0000000 1.0000000 0.0000000 0.5000000
# E 0.3333333 0.0000000 0.8164966 0.0000000 1.0000000 0.0000000
# F 0.4082483 0.7071068 0.0000000 0.5000000 0.0000000 1.0000000