R - 找到第 2 组的簇(对)
R - find clusters of group 2 (pairs)
我正在寻找一种方法来找到第 2 组(对)的集群。
有简单的方法吗?
想象一下,我有一些想要在 x
和 y
上进行匹配的数据,比如
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
您可以使用元素 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)
我正在寻找一种方法来找到第 2 组(对)的集群。 有简单的方法吗?
想象一下,我有一些想要在 x
和 y
上进行匹配的数据,比如
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
您可以使用元素 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)