在R中没有循环的矩阵上应用函数

时间:2015-09-23 10:40:12

标签: r

是的,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]))

1 个答案:

答案 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
相关问题