如何有效地将两个变量函数应用于data.frame(或矩阵)元素 - 以填充输出矩阵?

时间:2014-10-16 17:07:03

标签: r function matrix

我试图通过将函数应用于data.frame中的元素来找到更有效的方法来填充输出矩阵。我尝试了apply()家庭功能和outer()功能,但无法使其正常工作。

也许有人可以提供帮助?这是我的脚本的简化版本。谢谢!

set.seed(192)
n = 1000
distMatrix <- matrix(nrow=n,ncol=n) 

# Co-ordinates
coord <- data.frame(x = runif(n,min=0,max=n),
                    y = runif(n,min=0,max=n))

# Distance Function
distance <- function(A,B) { sqrt( (A['x']-B['x'])^2 + (A['y']-B['y'])^2  ) }

# Fill distMatrix -- this part could use better programming. Note that I am only
# filling the upper triangular part of distMatrix.
for (r in 1:(n-1)) {
    for (c in (r+1):n) {
        distMatrix[[r,c]] <- distance(coord[r,],coord[c,])
    }
}

1 个答案:

答案 0 :(得分:0)

您可以使用:

distFun <- function(A,B) 
  sqrt(
    (coord[A, "x"] - coord[B, "x"]) ^ 2 + 
    (coord[A, "y"] - coord[B, "y"]) ^ 2  
  )
distMatrix <- outer(1:nrow(coord), 1:nrow(coord), distFun)

请注意,我们需要传递outer两个向量。这里我们使用数据帧行的indeces。 outer然后生成两个新的向量,它们一起表示我们原始向量的每个可能组合,并将它们传递给我们的函数。然后我们的函数为我们的计算提取相关坐标(假设coord在函数之前被定义)。

使用outer时要理解的一件事是我们的函数只被调用一次。 outer只计算向量输入,假设我们的函数是矢量化的,然后将相应的维度应用于结果。

另外,请查看?dist

dist(coord)

尝试使用较小的矩阵(可能是10乘10)来查看结果。