Моя главная и самая важная цель - на самом деле найти группы, у которых много точек появляются на одной строке после друг друга, моя идея состояла в том, чтобы сделать это с помощью kmeans, но, возможно, у вас есть идея получше.
Я собираюсь объяснить это на основе двух графиков, которые Вы можете найти ниже (каждый график описывает одну группу):
Участок 1 для Группы 1 :
Мы можем видеть, что есть много точек, лежащих почти на одной оси y -> и я пытаюсь выяснить , как найти группы, имеющие такое "распределение точек"
Ниже у нас есть график 2 из Группа 2 , который не показывает такого "распределения точек"
Здесь мы можем найти данные , которые соответствуют обоим графикам выше :
structure(list(Group = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 1),
x = c(100L, 150L, 250L, 287L, 312L, 387L, 475L, 550L, 837L,
937L, 987L, 1087L, 1175L, 1300L, 1325L, 1487L, 1662L, 1700L,
1725L, 1812L, 1912L, 2412L, 3012L, 3562L, 4162L, 4762L, 5362L,
5750L, 5712L, 6225L, 6825L, 6887L, 7237L, 7850L, 7800L, 7937L,
7975L, 8275L, 8362L, 8662L, 8725L, 8950L, 9100L, 9312L, 9400L,
9600L, 550L, 612L, 1962L, 5412L, 8425L, 9375L, 5412L), y = c(493L,
482L, 479L, 476L, 481L, 479L, 474L, 480L, 480L, 491L, 489L,
490L, 485L, 485L, 485L, 479L, 482L, 482L, 482L, 482L, 484L,
489L, 491L, 489L, 496L, 498L, 500L, 0L, 498L, 500L, 502L,
506L, 497L, 0L, 495L, 506L, 497L, 494L, 498L, 500L, 496L,
499L, 496L, 495L, 495L, 498L, 442L, 447L, 394L, 465L, 806L,
700L, 502L)), row.names = c(23L, 24L, 25L, 26L, 27L, 28L,
29L, 30L, 31L, 32L, 33L, 34L, 35L, 36L, 37L, 38L, 39L, 40L, 41L,
42L, 43L, 44L, 45L, 46L, 47L, 48L, 49L, 51L, 52L, 53L, 54L, 55L,
56L, 57L, 58L, 59L, 60L, 61L, 62L, 63L, 64L, 65L, 66L, 67L, 68L,
69L, 574L, 575L, 576L, 577L, 578L, 579L, 815L), class = "data.frame")
Краткое объяснение:
Group x y
1 100 493
1 150 482
1 250 479
1 287 476
1 312 481
1 387 479
У нас есть каждая группа (1 и 2), координаты х и у.
Мой подход до сих пор:
Я округлил ось Y до 20, используя этот код
round_any = function(x, accuracy, f=round){f(x/ accuracy) * accuracy} # function to round the y
data$y_rd <- round_any(data$y, 20)
Я сделал это, потому что обычно указываетне кладите специально на одну и ту же строку y ..
Кроме того, я использовал этот код для создания кластеров для каждой группы на основе координаты x для каждой y_rd (округленная координата y):
data$id <- paste(data$Group, data$y_rd, sep = "_") # create id that contains Group and y_rd values
res2 <- tapply(data$x, INDEX = data$id, function(x) kmeans(x,2)) # kmeans with fixed number of clusters
res3 <- lapply(names(res2), function(x) data.frame(y=x, Centers=res2[[x]]$centers, Size=res2[[x]]$size))
res3 <- do.call(rbind, res3)
Однако это не работает так, как мне нужно, поскольку я не могу определить фиксированный номер кластера для каждой группы и y_rd ...
И в этот момент я застрял и не знаю, какой подход я могучтобы найти группы с таким распределением ...
Результат, который я хотел бы получить:
Group Cluster MaxPoints
1 1 3
1 2 20
1 3 7
Я открыт для любых идей или советов, которые помогли бы мне найти группы, демонстрирующие такой сбор.Спасибо!