R - 找到第 2 组的簇(对)

R - find clusters of group 2 (pairs)

我正在寻找一种方法来找到第 2 组(对)的集群。 有简单的方法吗?

想象一下,我有一些想要在 xy 上进行匹配的数据,比如

library(cluster)
set.seed(1)

df = data.frame(id = 1:10, x_coord = sample(10,10), y_coord = sample(10,10))

我想找到 x_coordy_coord 之间最近的一对距离:

d = stats::dist(df[,c(1,2)], diag = T)
h = hclust(d)
plot(h)

我得到了如下图所示的树状图。 我希望 将 (9,10)、(1,3)、(6,7)、(4,5) 对组合在一起。事实上,案例 8 和案例 2 将被单独删除。

也许有比聚类更有效的替代方法。

最终我想删除不匹配的 ID 并保留对并拥有这样的数据集:

  id x_coord y_coord  pair_id
   1       9       3  1
   3       7       5  1 
   4       1       8  2
   5       2       2  2
   6       5       6  3
   7       3      10  3 
   9       6       4  4
  10       8       7  4

您可以使用元素 h$merge。此 two-column 矩阵中包含负值的任何行都表示一对单例。因此你可以这样做:

pairs   <- -h$merge[apply(h$merge, 1, function(x) all(x < 0)),]
df$pair <- (match(df$id, c(pairs)) - 1) %% nrow(pairs) + 1
df <- df[!is.na(df$pair),]

df
#>    id x_coord y_coord pair
#> 1   1       9       3    4
#> 3   3       7       5    4
#> 4   4       1       8    1
#> 5   5       2       2    1
#> 6   6       5       6    2
#> 7   7       3      10    2
#> 9   9       6       4    3
#> 10 10       8       7    3

请注意,对数等于树状图上的“高度”。如果您希望它们根据它们在数据框中出现的顺序升序排列,您可以添加行

df$pair <- as.numeric(factor(df$pair, levels = unique(df$pair)))

无论如何,如果我们在新修改的 df 上重复您的绘图代码,我们可以看到没有未配对的单例:

d = stats::dist(df[,c(1,2)], diag = T)
h = hclust(d)
plot(h)

我们可以看到该方法很好地缩放:

df = data.frame(id = 1:50, x_coord = sample(50), y_coord = sample(50))
d = stats::dist(df[,c(1,2)], diag = T)
h = hclust(d)
pairs   <- -h$merge[apply(h$merge, 1, function(x) all(x < 0)),]
df$pair <- (match(df$id, c(pairs)) - 1) %% nrow(pairs) + 1
df <- df[!is.na(df$pair),]
d = stats::dist(df[,c(1,2)], diag = T)
h = hclust(d)
plot(h)