我有两个简单的整数向量,比如说,
ii <- 1:3
jj <- 1:2
names(ii) <-paste0("I_",ii)
names(jj) <-paste0("J_",jj)
ii;jj
I_1 I_2 I_3
1 2 3
J_1 J_2
1 2
如果我在它们之间执行默认外部产品, 这就是我得到的:
outer(ii,jj)
J_1 J_2
I_1 1 2
I_2 2 4
I_3 3 6
明确地给一个函数,比如,连接向量的元素,这就是我得到的,
outer(ii, jj, function(i,j) paste(i,j,sep = "-"))
J_1 J_2
I_1 "1-1" "1-2"
I_2 "2-1" "2-2"
I_3 "3-1" "3-2"
然而,当我尝试更进一步时,使用ii和jj作为两组位置向量的索引,为了计算向量之间的距离,这个想法失败了,如下所示,
vi <- data.frame(x=c(3,1,0), y=c(2,1,0)) # three position vectors
vj <- data.frame(x=c(7,1), y=c(5,1)) # two position vectors
vi;vj
x y
1 3 2
2 1 1
3 0 0
x y
1 7 5
2 1 1
计算两点之间距离的函数:
distk <- function(p,p0) { # two point distance
sqrt(sum((p0-p)^2))
}
例如,要计算集合1的点3与集合2的点1之间的距离:
distk(vi[3,], vj[1,])
[1] 8.602325
当我尝试使用外部产品时,按照上面的逻辑,计算从集合1中的点到集合2中的点的距离,我只得到一个错误:
outer(ii, jj, function(i,j) distk(vi[i,], vj[j,]))
dim(robj)中的错误&lt; - c(dX,dY):dims [product 6]与之不一致 对象[1]长度
我在这里缺少什么吗?或许,我还没有完全理解外部产品......
答案 0 :(得分:1)
在joran评论之后,我根据之前的 distk()函数引入了距离函数的矢量化版本,如下所示,
distv <- function(p,p0) { # vectorized version
p <- if (is.null(dim(p))) as.data.frame(p) else as.data.frame(t(p))
p0 <- if (is.null(dim(p0))) as.data.frame(p0) else as.data.frame(t(p0))
mapply(distk, p, p0)
}
将此功能与 outer()结合使用,我得到了理想的结果:
outer(ii, jj, function(i,j) distv(vi[i,], vj[j,]))
J_1 J_2
I_1 5.000000 2.236068
I_2 7.211103 0.000000
I_3 8.602325 1.414214