Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.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_Dataframe_Duplicates_Combinatorics - Fatal编程技术网

R 最大化包含两个列表中所有元素的唯一对

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

我有一个带有成对元素的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    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