我可以使用带有二维向量的outer()或apply()函数吗?

时间:2014-06-06 14:06:07

标签: r for-loop performance outer-join

我正在处理间隔,我想有一种有效的方法来找到每个间隔之间的距离。距离函数都采用两个二维向量。我需要将每一行放在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()工作,我也会没事的。什么加速我的可耻的循环!

2 个答案:

答案 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