我正在处理间隔,我想有一种有效的方法来找到每个间隔之间的距离。距离函数都采用两个二维向量。我需要将每一行放在nx2数据帧中的每一行。
这里是我现在的代码(内部距离只是一个示例函数,但所有函数都采用相同的输入):
# Inside takes vectors I1 and I2
inside <- function(I1, I2) min(I1[1]-I2[2], I2[1]-I1[2])
# the example intervals are (0,1), (1,2), and (4,5).
I <- data.frame(l=c(0,1,4), u=c(1,2,5))
n <- nrow(I)
d <- matrix(rep(NA, n^2), nrow=n)
# I'm ashamed that I wrote nested for loops (I have no programming training)
for(i in 1:n){
for(j in 1:n){
d[i,j] <- inside(I[i,],I[j,])
}
}
这是模拟研究的一部分,因此该代码必须运行数千次。由于它使用嵌套的for循环,因此效率低得令人震惊。这是我想要使用的代码:
index <- 1:nrow(I)
d <- outer(index, index, function(x, y) inside(I[x,], I[y,]))
如果该代码有效,我不会在这里寻求你的帮助。
如果我能以某种方式获得apply()工作,我也会没事的。什么加速我的可耻的循环!
答案 0 :(得分:2)
首先,创建inside
的矢量化版本:
vecInside <- Vectorize(function(x, y) inside(I[x, ], I[y, ]))
其次,在外部使用此功能:
outer(index, index, vecInside)
结果:
[,1] [,2] [,3]
[1,] -1 -2 -5
[2,] -2 -1 -4
[3,] -5 -4 -1
答案 1 :(得分:2)
v_outer
中的outer
函数(向量化qdaTools
)适用于此类任务:
library(qdapTools)
v_outer(t(I), inside)
## V1 V2 V3
## V1 -1 -2 -5
## V2 -2 -1 -4
## V3 -5 -4 -1