0

rdist在计算出 x 和 y 坐标的两个向量之间所有欧几里得距离的矩阵方面做得很好。

但是,rdist如果您只需要一些比较,想要比较所有可以提供超出您需要的输出的东西。例如

df <- data.frame(x1=c(0,0),y1=c(0,0),x2=c(0,2),y2=c(0,0))

# df
# x1 y1 x2 y2
# 1  0  0  0  0
# 2  0  0  2  0
# where   (x1,y1) are vectors for the first points and (x2,y2) are
# vectors for the second points. We want distances between points 1 and 
# points 2 for each row

如果我们只想与同一行的那个谎言进行比较x1,y1x2,y2那么下面的方法是一个杀手:

library(fields)
rdist(cbind(c(df[,1],df[,3]),c(df[,2],df[,4])))

所以我的问题是实现这一目标的最佳方法是什么?我能想到:

library(fields)

df <- data.frame(x1=c(0,0,0,5),y1=c(0,0,0,3),x2=c(0,2,3,6),y2=c(0,0,0,9))
results <- apply(df,1,function(x) rdist(cbind( c(x[1],x[3]),c(x[2],x[4]))))

然后从我的距离偷走第二排或第三排results...

4

1 回答 1

1

我认为您的问题来自于您的数据采用无用的宽格式。

如果您将两个点集 1 和 2 拆分为单独的 data.frames

df1 <- data.frame(x = c(0,0), y = c(0,0))
df2 <- data.frame(x=c(0,2),y=c(0,0))

然后你的行指的是点,你的列指的是各自的 x 和 y 坐标

然后你可以使用某种lapply/sapply解决方案来逐行比较

#using lapply returns a list of matrices
lapply(1:2, function(x,d1 =df1,d2 = df2){rdist(d1[x,,drop=F], d2[x,,drop=F])})
[[1]]
      [,1]
[1,] 1e-10

[[2]]
     [,1]
[1,]    2
# sapply will simplify to a vector
sapply(1:2, function(x,d1 =df1,d2 = df2){rdist(d1[x,,drop=F], d2[x,,drop=F])})
[1] 1e-10 2e+00
于 2012-11-08T22:58:58.927 回答