r - 如何将有序列表合并为一个,保持顺序(使用 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 的所有元素的“主”列表?我什至不知道要搜索什么关键字。非常感谢任何提示。
解决方案
基于图形的方法怎么样。
主意
这个想法是将序列转换为有向图中的路径(因此A G F C D
成为路径A->G->F->C->D
)。通过简化图,我们可以识别该图中最长的连接序列,然后它应该对应于您的“主”序列。
执行
请注意,我假设您的样本数据lst
是一个list
向量(请参阅本答案末尾的样本数据)。
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]])
接下来我们
simplify
上图ig <- simplify(ig)
绘制图表很有指导意义
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)
推荐阅读
- android-mediaplayer - 想要在原生 c/c++ for android 中创建自定义音频效果
- tsql - 将运算符转换为整数
- r - R - 了解循环以及为什么它只抓取 10 个项目
- r - 如何根据 r 中具有相同维度的不同矩阵删除矩阵的行?
- javascript - Openlayers 示例:如何使用它们?
- tensorflow - 用于检测小物体的 SSD
- c - 将 C 结构双指针转换为 Swift 结构不安全指针
- javascript - 通过单击子区域中的按钮关闭模式内联对话框并防止它重新打开
- ios - Swift 地图注释
- python - 列出目录中的所有文件,然后使用命令行选择一个要使用的文件 - Python