0

rdistx 座標と y 座標の 2 つのベクトル間のすべてのユークリッド距離の行列をうまく計算します。

ただし、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,y1したい場合は、次の方法がキラーです。x2,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]))))

次に、距離として 2 列目または 3 列目を盗みresultsます...

4

1 に答える 1

1

あなたの問題は、データが役に立たないワイドフォーマットになっていることに起因すると思います。

2 つのポイント セット 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 に答える