【发布时间】:2018-06-04 03:53:32
【问题描述】:
每个观察值都有 3 个离散属性。如果对于 2 次观察,这些属性中至少有 2 个具有相同的值,那么我想将它们组合在一起(实际上总是最多 2 个属性相同)。
我的想法是建立一个分组矩阵。每一行和每一列代表一个观察结果。行和列的交叉点表示两个观察值的“相似性”,如果至少有两个属性值相同,则应该取值TRUE,否则取值为FALSE。
这是我所做的可重现示例(a、b、c 是要比较的属性):
df <- data.frame(a = c(1, 1, 2, 2, 3),
b = c(1, 2, 3, 2, 4),
c =c("a", "a", "d", "a", "c"))
grouping_matrix <- matrix(nrow = nrow(df), ncol = nrow(df))
for (i in 1:nrow(df)){
for (j in 1:nrow(df)){
if(sum(df[i, ] == df[j, ]) >= 2) {
grouping_matrix [i, j] <- TRUE
} else {
grouping_matrix [i, j] <- FALSE
}
}
}
> df
a b c
1 1 1 a
2 1 2 a
3 2 3 d
4 2 2 a
5 3 4 c
> grouping_matrix
[,1] [,2] [,3] [,4] [,5]
[1,] TRUE TRUE FALSE FALSE FALSE
[2,] TRUE TRUE FALSE TRUE FALSE
[3,] FALSE FALSE TRUE FALSE FALSE
[4,] FALSE TRUE FALSE TRUE FALSE
[5,] FALSE FALSE FALSE FALSE TRUE
这行得通。然而,即使是几千次观察,也需要很长时间。
我很确定有一些更有效的方法,例如一些data.table 魔法。如果问题没有明确说明,请告诉我。
【问题讨论】:
标签: r dplyr data.table cluster-analysis