gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 23:44:15 30 4
gpt4 key购买 nike

我正在寻找一种方法来找到第 2 组(对)的集群。
有没有一种简单的方法可以做到这一点?
想象一下,我有某种数据想要匹配 xy , 喜欢

library(cluster)
set.seed(1)

df = data.frame(id = 1:10, x_coord = sample(10,10), y_coord = sample(10,10))
我想找到 x_coord 之间最近的一对距离和 y_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
enter image description here

最佳答案

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

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)
enter image description here
我们可以看到该方法很好地扩展:
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)
enter image description here

关于R - 找到第 2 组(成对)的簇,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63860558/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com