7

行列を考えると、

df <- read.table(text="
 X1 X2 X3 X4 X5
  1  2  3  2  1
  2  3  4  4  3
  3  4  4  6  2
  4  5  5  5  4
  2  3  3  3  6
  5  6  2  8  4", header=T)

各列の各行の絶対平均差を含む距離行列を作成したいと考えています。たとえば、次の場合、 と の間の距離はX1= X31.67 になります。

abs(1 - 3) + abs(2-4) + abs(3-4) + abs(4-5) + abs(2-3) + abs(5-2) = 10 / 6 = 1.67

designdist()この方法でビーガンパッケージの関数を使用してみました:

designdist(t(df), method = "abs(A-B)/6", terms = "minimum")

列 1 と 3 の結果の距離は 0.666 です。この関数の問題は、各列のすべての値を合計してから減算することです。しかし、各行の絶対差 (個別、絶対) を合計し、それを N で割る必要があります。

4

1 に答える 1

5

これが1行のソリューションです。dist()method引数を利用して、data.frame内の列の各ペア間のL1ノルム、別名街区距離、別名マンハッタン距離を計算します。

as.matrix(dist(df, "manhattan", diag=TRUE, upper=TRUE)/nrow(df))

再現可能にするには:

df <- read.table(text="
 X1 X2 X3 X4 X5
  1  2  3  2  1
  2  3  4  4  3
  3  4  4  6  2
  4  5  5  5  4
  2  3  3  3  6
  5  6  2  8  4", header=T)

dmat <- as.matrix(dist(df, "manhattan", diag=TRUE, upper=TRUE)/nrow(df))
print(dmat, digits=3)
#      1     2     3    4     5    6
# 1 0.00 1.167 1.667 2.33 1.333 3.00
# 2 1.17 0.000 0.833 1.17 0.833 2.17
# 3 1.67 0.833 0.000 1.00 1.667 1.67
# 4 2.33 1.167 1.000 0.00 1.667 1.33
# 5 1.33 0.833 1.667 1.67 0.000 2.33
# 6 3.00 2.167 1.667 1.33 2.333 0.00
于 2012-05-22T17:52:42.983 に答える