Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将有序列表合并为一个,保持顺序(使用R)_R_Sorting_Merge_Missing Data - Fatal编程技术网

如何将有序列表合并为一个,保持顺序(使用R)

如何将有序列表合并为一个,保持顺序(使用R),r,sorting,merge,missing-data,R,Sorting,Merge,Missing Data,例如,我有许多有序列表(或序列、或向量、或数据表列)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?我甚至不知道要搜索什么关键字。非常感谢任何提示。有趣的问题。我想我有一个有效的解决办法 我的想法是,我们可以将向量编码成一个矩阵,通过逻辑跟踪每个字母前后必须出现的字母。然后我们应该能够对矩阵进行排序,以找到工作顺序 在这里,我使用三个向量,并使用嵌套循

例如,我有许多有序列表(或序列、或向量、或数据表列)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?我甚至不知道要搜索什么关键字。非常感谢任何提示。

有趣的问题。我想我有一个有效的解决办法

我的想法是,我们可以将向量编码成一个矩阵,通过逻辑跟踪每个字母前后必须出现的字母。然后我们应该能够对矩阵进行排序,以找到工作顺序

在这里,我使用三个向量,并使用嵌套循环对它们的隐含顺序进行编码

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

vecs <- list(v1, v2, v3)
unique_ltrs <- unique(unlist(vecs))
ltr_len <- length(unique_ltrs)
m <- matrix(0, nrow = ltr_len, ncol = ltr_len, 
       dimnames = list(unique_ltrs, unique_ltrs))

# Loops to populate m with what we know
for (v in 1:length(vecs)) {
  vec <- unique(unlist(vecs[v]))
  for (l in 1:length(vec)) {
    for (l2 in 1:length(vec)) {
      m_pos <- c(match(vec[l], unique_ltrs),
                 match(vec[l2], unique_ltrs))
      compare <- ifelse(l < l2, -1, ifelse(l2 < l, 1, 0))
      m[m_pos[1], m_pos[2]] <- compare
    }
  }
}
然后我们对矩阵进行排序(取决于代码),行名中会出现一个工作顺序:

m_ord <- m[do.call(order, as.data.frame(m)),]
#> m_ord
#   A  G  F  C  D  E B
#B -1 -1  0  0  0  0 0
#A  0 -1 -1 -1 -1 -1 1
#G  1  0 -1 -1 -1 -1 1
#F  1  1  0 -1 -1 -1 0
#E  1  1  1 -1  0  0 0
#C  1  1  1  0 -1  1 0
#D  1  1  1  1  0  0 0
rownames(m_ord)
#[1] "B" "A" "G" "F" "E" "C" "D"
m_ord m_ord
#A G F C D E B
#B-1-100
#0-1-1-1-1-1-1
#G10-1-1-1-1-1
#F110-1-1-10
#e111-100
#C110-1110
#D 1 1 0 0 0 0
行名(m_ord)
#[1] “B”“A”“G”“F”“E”“C”“D”

基于图形的方法怎么样

主意 其思想是将序列转换为有向图中的路径(因此
agfcd
成为路径
a->G->F->C->D
)。通过简化该图,我们可以识别该图中最长的连接序列,该序列应与您的“主”序列相对应

实施 请注意,我假设您的样本数据
lst
是向量的
列表(参见本答案末尾的样本数据)

  • 让我们从不同的
    路径
    s构建一个
    igraph
    ;每个路径由
    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]])
    
  • 画这张图很有指导意义

    ig <- simplify(ig)
    
    plot(ig)
    

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


    pths您能发布一个您想要的输出示例吗?我已经在问题中澄清了输出应该是什么。有趣的问题。如果你必须用笔和纸来做,你会怎么做?我会比较1和2元素,直到它们不再匹配(第4行)。然后我将1的剩余部分向下移动,用NA填充间隙,直到元素再次匹配。这似乎是一个非常困难的问题。我喜欢这个解决方案!非常感谢你考虑了一个陌生人的问题。不知道为什么会投反对票。有趣问题的有趣答案。(+1)我不理解这个解决方案(以前从未使用过图形),但它看起来很优雅。我会看看我是否能实施它。非常感谢@mcenno我已经添加了更多的细节来详细阐述关键思想。
    
    plot(ig)
    
    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)