2

この質問は、距離行列からグループ内距離とグループ間距離を抽出する方法のフォローアップのようなものですか? Rで。その質問では、最初にすべてのポイントの距離行列を計算し、次に単純にクラス間距離行列を抽出しました。最初の計算をバイパスして抽出にスキップしたい状況があります。つまり、クラス間距離行列を直接計算したいのです。リンクされた例から微調整を加えて描画すると、次のデータフレームにいくつかのデータがあるとしdfます。

values<-c(0.002,0.3,0.4,0.005,0.6,0.2,0.001,0.002,0.3,0.01)
class<-c("A","A","A","B","B","B","B","A","B","A")
df<-data.frame(values, class)

私が欲しいのは距離行列です:

    1    2    3    8   10
4 .003 .295 .395 .003 .005
5 .598 .300 .200 .598 .590
6 .198 .100 .200 .198 .190
7 .001 .299 .399 .001 .009
9 .298 .000 .100 .298 .290

これを行うためのエレガントで高速な方法がRにすでに存在しますか?

EDIT上記の1Dケースの適切な解決策を受け取った後、ボーナスの質問を考えました.高次元のケースはどうですか?代わりに次のようにdf見える場合:

values1<-c(0.002,0.3,0.4,0.005,0.6,0.2,0.001,0.002,0.3,0.01)
values2<-c(0.001,0.1,0.1,0.001,0.1,0.1,0.001,0.001,0.1,0.01)
class<-c("A","A","A","B","B","B","B","A","B","A")
df<-data.frame(values1, values2, class)

Bそして、 class 内のポイントと class 内のポイントの間のユークリッド距離の行列を再度取得することに興味がありAます。

4

2 に答える 2

2

これは、各組み合わせを生成し、各値から単純に差をとることによる試みです。

abs(matrix(Reduce(`-`, expand.grid(split(df$values, df$class))), nrow=5, byrow=TRUE))
#      [,1]  [,2]  [,3]  [,4]  [,5]
#[1,] 0.003 0.295 0.395 0.003 0.005
#[2,] 0.598 0.300 0.200 0.598 0.590
#[3,] 0.198 0.100 0.200 0.198 0.190
#[4,] 0.001 0.299 0.399 0.001 0.009
#[5,] 0.298 0.000 0.100 0.298 0.290
于 2016-08-22T23:46:15.753 に答える