我试图通过将函数应用于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,])
}
}
答案 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)来查看结果。