首页 > 解决方案 > 如何将有序列表合并为一个,保持顺序(使用 R)

问题描述

我有许多有序列表(或序列,或向量,或数据表列)1、2、3,其中有几个项目,例如

1 2 3
A A B
G G A
F F G
C E
D C
  D

如何有效地推导出包含正确顺序 B、A、G、F、E、C、D 的所有元素的“主”列表?我什至不知道要搜索什么关键字。非常感谢任何提示。

标签: rsortingmergemissing-data

解决方案


基于图形的方法怎么样。

主意

这个想法是将序列转换为有向图中的路径(因此A G F C D成为路径A->G->F->C->D)。通过简化图,我们可以识别该图中最长的连接序列,然后它应该对应于您的“主”序列。

执行

请注意,我假设您的样本数据lst是一个list向量(请参阅本答案末尾的样本数据)。

  1. igraph让我们从不同的 s构造一个path;每个路径由lst向量中的条目给出。

    library(igraph)
    ig <- make_empty_graph(
        n = length(unique(unlist(lst))),
        directed = TRUE) %>%
        set_vertex_attr("name", value = sort(unique(unlist(lst))))
    
    for (i in 1:length(lst)) ig <- ig + path(lst[[i]])
    
  2. 接下来我们simplify上图

    ig <- simplify(ig)
    
  3. 绘制图表很有指导意义

    plot(ig)
    

    在此处输入图像描述

  4. 我们现在提取所有简单路径;最长的简单路径对应于“主”列表。

    pths <- sapply(V(ig), function(x) {
        p <- all_simple_paths(ig, x)
        names(unlist(p[which.max(lengths(p))]))
    })
    
    pths[which.max(lengths(pths))]
    $B
    #[1] "B" "A" "G" "F" "E" "C" "D"
    

    该序列与您对主列表的预期输出相匹配。


样本数据

v1 <- c("A","G","F","C","D","D")
v2 <- c("A","G","F","E","C")
v3 <- c("B", "A","G")

lst <- list(v1, v2, v3)

推荐阅读