1

ポイントの xy 座標があり、ポイントの平均化に距離を使用したいと考えています。データに名前を付け、関数qqを使用して距離行列を取得しますdist

qq
       X      Y
2 4237.5 4411.5
3 4326.5 4444.5
4 4382.0 4418.0
5 4204.0 4487.5
6 4338.5 4515.0

mydist = as.matrix(dist(qq))

          2         3         4        5         6
2   0.00000  94.92102 144.64612  83.0557 144.61414
3  94.92102   0.00000  61.50203 129.8278  71.51398
4 144.64612  61.50203   0.00000 191.0870 106.30734
5  83.05570 129.82777 191.08702   0.0000 137.28256
6 144.61414  71.51398 106.30734 137.2826   0.00000

私がやりたいことは、特定のしきい値に近いポイントを平均化することです。この例では、80 を使用できます。その制限を下回る唯一のペアワイズ距離は、3-4 と 3-6 です。問題は、元の行列に戻り、xy 座標を平均して、3-4 ペアを 1 つのポイントにし、3-6 ペアを別のポイントにする方法です (以前のポイント 3、4、および 6 を破棄します)。

ここdputに私のdata.frameがあります

dput(qq)
structure(list(X = c(4237.5, 4326.5, 4382, 4204, 4338.5), Y = c(4411.5, 
4444.5, 4418, 4487.5, 4515)), .Names = c("X", "Y"), row.names = 2:6, class = "data.frame")

アップデート

提供されている変更コードの一部を使用して、3-4 の場所と 3-6 の場所で置き換える必要がある 2 つのポイントを取得します。これは、ポイント 3 と 4 と 6 が qq から消える必要があり、この 2 つのポイントがそれに追加される必要があることを意味します

pairs <- which(as.matrix(dist(qq)) < 80 & upper.tri(as.matrix(dist(qq))), arr.ind = T)
t(apply(pairs,1,function(i) apply(qq[i,],2,mean)))
        X       Y
3 4354.25 4431.25
3 4332.50 4479.75
4

2 に答える 2

0

わかりましたので、戦略をマージして問題を解決できましたが、派手な方法ではありませんでした

# Search pairs less than threshold
pairs <- which(as.matrix(dist(qq)) < 80 & upper.tri(as.matrix(dist(qq))), arr.ind = T)

# Get the row numbers for subsetting the original matrix 
indx=unique(c(pairs[,1],pairs[,2]))

# Get result dataframe
out = data.frame(rbind(qq[-indx,],t(apply(pairs,1,function(i) apply(qq[i,],2,mean)))),row.names=NULL)

dim(out)
[1] 4 2

out
        X       Y
1 4237.50 4411.50
2 4204.00 4487.50
3 4354.25 4431.25
4 4332.50 4479.75

元のポイントを削除して新しいポイントを追加したので、row.names は何の意味もないため削除されます。私はまだそれを行うためのより良い方法を受け入れ、すべてが正しく行われていることを確認します.

アップデート

物事を段階的に行うよりも便利な関数を作成し、しきい値で遊んでみましょう。

distance_fix = function(dataframe,threshold){


  mydist = as.matrix(dist(dataframe))

  # Which pairs in the upper triangle are below threshold 
  pairs <- which(mydist < threshold & upper.tri(mydist), arr.ind = T)

  # Get the row numbers for subsetting the original matrix 
  indx=unique(c(pairs))

  # Get result dataframe
  out = data.frame(rbind(dataframe[-indx,],t(apply(pairs,1,function(i) apply(dataframe[i,],2,mean)))),row.names=NULL)

 return(out) 
}
于 2016-07-27T15:16:06.970 に答える