R 最大化包含两个列表中所有元素的唯一对
我有一个带有成对元素的data.frame,第1列和第2列中的元素都可以重复。我希望获得最大的对数,每个列中有一个唯一的元素,但如果可能的话,所有元素都在第1列和第2列中R 最大化包含两个列表中所有元素的唯一对,r,dataframe,duplicates,combinatorics,R,Dataframe,Duplicates,Combinatorics,我有一个带有成对元素的data.frame,第1列和第2列中的元素都可以重复。我希望获得最大的对数,每个列中有一个唯一的元素,但如果可能的话,所有元素都在第1列和第2列中 > col1 = c("A","A","A","B","C","C") > col2 = c("X","Y","Z","Y","X","Y") > df = data.frame(col1,col2) > df col1 col2 1 A X 2 A Y 3 A
> col1 = c("A","A","A","B","C","C")
> col2 = c("X","Y","Z","Y","X","Y")
> df = data.frame(col1,col2)
> df
col1 col2
1 A X
2 A Y
3 A Z
4 B Y
5 C X
6 C Y
我可以从一列中获得具有唯一值的对,但这有时会得到不具有另一列中所有可能值的对
> df2 = df[!duplicated(df$col1),]
> df2
col1 col2
1 A X
4 B Y
5 C X
在这种情况下,X在col2中重复,Z丢失
在这种情况下,我的预期输出是:
col1 col2
3 A Z
4 B Y
5 C X
有没有办法最大化成对,使两个列表的每个元素都至少出现在成对列表中一次?以下是一种受最小生成树问题启发的方法:
library(igraph)
g <- graph_from_data_frame(df, FALSE)
MST <- mst(g)
#get leaf nodes
leaves <- which(degree(MST, v=V(MST))==1L, useNames=TRUE)
#get neighbour to each leaf node in a greedy manner starting with leaf nodes with least neighbours
ans <- sapply(adjacent_vertices(MST, sort(leaves)), function(gph) names(gph))
data.table(col1=ifelse(ans %in% df$col1, ans, names(ans)),
col2=ifelse(ans %in% df$col2, ans, names(ans)))[order(col1)]
它工作得很好!非常感谢你!然而,第一对是反向的,我可以手动改变它,但我不知道为什么会发生这种情况。它们在图中的顺序正确,但在计算叶节点时,会切换第一对。您可以使用setNames(ifelse(ans%in%df1$col1,ans,names(ans)),ifelse(ans%in%df1$col2,ans,names(ans))。非常有趣的问题。我可以知道您所在的区域和应用程序吗?谢谢您的回答!我正在处理DNA序列,我需要对它们进行配对,并使用每个列表中最多的序列数选择唯一序列对。我编写了一个嵌套循环,每次都删除最不常见的序列对,但这种方法非常复杂再次感谢!哦,如果订购不重要,网上还有一些更快的方法。
col1 col2
1: A Z
2: B Y
3: C X