У меня есть список векторов, и я хочу определить группы векторов, которые имеют> 80% своих значений. Я бы хотел, чтобы новые группы назывались именами всех векторов, входящих в группы. И я хочу, чтобы новые элементы групп были всеми возможными элементами из сгруппированных векторов. Я не уверен, насколько это возможно.

Вот простой пример:

a <- c(1,2,3,4,5,6,7,8,9,10,11,12,13,14)
b <- c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15)
c <- c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,16)
d <- c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17)
e <- c(1,2,3,4,5,6)
f <- c(18,19,20,21,22,23,24,25,26)
g <- c(18,19,20,21,22,23,24,25)
h <- c(18,19,20,21,22,23,24)
i <- c(18,19,1,2,3,4,5,6,7)

Думаю, у нас получится две группы:

a-b-c-d-e-i
[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
f-g-h
[1] 18 19 20 21 22 23 24 25 26

Значения в векторах не обязательно должны быть числовыми, они могут быть строками. Дайте мне знать, если мне нужно будет указать что-нибудь еще. Спасибо!

r
1
arielle 19 Ноя 2017 в 03:05

1 ответ

Лучший ответ

Предполагая, что векторы находятся в списке V, показанном в примечании в конце этого ответа, вычислите матрицу смежности adj так, чтобы adj[i,j] было равно 1, если i-й и j-й вектор имеют не менее 80% их элементы являются общими и 0 в противном случае. Мы основываем это на доле меньшего из двух векторов. Затем используйте пакет igraph для преобразования adj в граф g и вычисления его компонентов.

library(igraph)

overlap <- function(u, v) length(intersect(u, v)) / min(length(u), length(v)) > 0.8
adj <- sapply(V, function(u) sapply(V, overlap, u)) + 0
g <- graph_from_adjacency_matrix(adj)
memb <- components(g)$membership
memb
## a b c d e f g h i 
## 1 1 1 1 1 2 2 2 1 

s <- split(V, memb)
groups <- lapply(s, function(x) unique(unlist(x)))
names(groups) <- lapply(s, function(x) paste(names(x), collapse = "-"))
groups

Давая :

$`a-b-c-d-e-i`
 [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19

$`f-g-h`
[1] 18 19 20 21 22 23 24 25 26

Мы также можем построить график:

plot(g)

screenshot

Примечание.

V <- structure(list(a = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 
14), b = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15), 
    c = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 16), 
    d = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 
    16, 17), e = c(1, 2, 3, 4, 5, 6), f = c(18, 19, 20, 21, 22, 
    23, 24, 25, 26), g = c(18, 19, 20, 21, 22, 23, 24, 25), h = c(18, 
    19, 20, 21, 22, 23, 24), i = c(18, 19, 1, 2, 3, 4, 5, 6, 
    7)), .Names = c("a", "b", "c", "d", "e", "f", "g", "h", "i"
))
2
G. Grothendieck 19 Ноя 2017 в 12:33