-1

大家晚上好,

我正在尝试根据它们在 3 列上的值对数据进行分组。我想对 X、Y 和 Z 坐标彼此相差小于 12% 的行进行分组。换句话说,对于每个观察值,我想检查它们的 X、Y 和 Z 值是否与表中的另一个观察值的差异小于 12%。我的数据框看起来或多或少是这样的:

ID X Z
1 33 3 1
2 27 42 1
3 32 3 58
4 33 3 1
5 25 2 22
6 37 119 3

ID 1 和 4 应属于同一组,因为它们的 X、Y 和 Z 坐标之间的差异小于 12%。我正在考虑遍历整个数据框(遍历 x 以查找相似的行,然后通过 Y 查找相似的行,最后通过 Z,然后检查是否会通过 X、Y 和 Z 出现某些结果,但它非常复杂并且似乎效果不佳。我也尝试以这种方式手动对它们进行分组:

df %>% group_by(IDscrit) %>% summarize(n())
df$group <- ifelse(df$X <2 & df$Y <2 & df$Z <2, "group1", 
       ifelse(df$X <5 & df$X >2 & df$Y <5 &df$Y >2 & df$Z <5 & df$Z >2, "group2", NA))

但是由于非常明显的原因(不方便,我排除了许多任意分组的值,尽管它们可能彼此接近,例如,如果我的表显示这些值:

ID X Z
14 4 3 1
26 6 3 2

他们不会被分组,虽然他们应该),因此这也行不通......我会非常感谢任何建议,真的......这远远超出了我的编码能力,我什至不知道哪个部分我应该再选择这个问题。

4

2 回答 2

0

在最后的注释中使用DF定义的可重现性,我们定义is.near了两个数字向量,每个向量代表 X、Y 和 Z,如果它们彼此相差 12% 以内,则返回 TRUE,否则返回 FALSE。(如果您需要不同的接近度定义,请根据需要进行更改is.near。)使用它,我们从行中形成邻接矩阵 A,将其转换为图 g 并提取连接组件的 id。

library(igraph)

is.near <- function(r, s) {
  max(abs(r - s)) < 0.12 * min(abs(r), abs(s))
}

nr <- nrow(DF)
s <- split(as.matrix(DF[-1]), 1:nr)
A <- outer(s, s, Vectorize(is.near)) - diag(nr)
g <- graph_from_adjacency_matrix(A, "undirected")
transform(DF, group = components(g)$membership)
##   ID  X   Y  Z group
## 1  1 33   3  1     1
## 2  2 27  42  1     2
## 3  3 32   3 58     3
## 4  4 33   3  1     1
## 5  5 25   2 22     4
## 6  6 37 119  3     5

plot(g)

截屏

笔记

DF <- structure(list(ID = 1:6, X = c(33L, 27L, 32L, 33L, 25L, 37L), 
    Y = c(3L, 42L, 3L, 3L, 2L, 119L), Z = c(1L, 1L, 58L, 1L, 
    22L, 3L)), row.names = c(NA, -6L), class = "data.frame")
于 2021-10-04T13:20:56.060 回答
0

以下给出

最大 {abs(X_a - X_b),abs(Y_a - Y_b),abs(Z_a - Z_b)}

df <- tribble(
~ID, ~X, ~Y, ~Z,    
1, 33, 3, 1, 
2, 27, 42, 1, 
3, 32, 3, 58, 
4, 33, 3, 1, 
5, 25, 2, 22, 
6, 37, 119, 3)

dist(df[,-1],method = "maximum")

输出:

    1   2   3   4   5
2  39                
3  57  57            
4   0  39  57        
5  21  40  36  21    
6 116  77 116 116 117

现在,你可以组成你想要的组了,我猜。

于 2021-10-03T23:31:36.853 回答