【问题标题】:R: Find groups of vectors that have a > 80% overlap in their elementsR:查找元素重叠率 > 80% 的向量组
【发布时间】:2021-11-17 01:05:11
【问题描述】:

我有一个向量列表,我想确定共享 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】:

    假设向量在此答案末尾注释中显示的列表 V 中,计算邻接矩阵 adj,如果第 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)
    

    注意:

    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"
    ))
    

    【讨论】:

    • 这似乎很适合对向量进行分组!我还问过要使用组中包含的所有向量的名称(即 a-b-c-d-e-i 和 f-g-h)来命名新组,我们该怎么做?
    • 已添加。
    • 谢谢!此外,我提到我正在寻找代表每个组的新向量,其中元素将是构成组的向量中的所有可能元素。这有意义吗?
    • 哦,这也包含在您刚刚添加的代码中吧?
    • 顺便说一句很棒,情节是一个很好的补充
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-15
    • 2016-06-11
    • 2020-12-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多