组合法-最大化唯一对,包括两个列表中的所有元素

时间:2019-08-06 20:13:36

标签: r dataframe duplicates combinatorics

我有一个包含成对元素的data.frame,第1列和第2列中的两个元素都可以重复。我想获得最大的对数,每列具有唯一的元素,但如果可能的话,在column1和column2中具有所有元素。

> 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

在这种情况下,col2中重复X,而Z丢失。

在这种情况下,我的预期输出为:

  col1 col2
3    A    Z
4    B    Y
5    C    X

有什么方法可以最大化配对,以使两个列表中的每个元素都至少出现一次?

1 个答案:

答案 0 :(得分:0)

这是一种受最小生成树问题启发的方法:

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)]

方法假定存在很多连接,因此每个节点至少有一个。

对于OP,我将有兴趣找出可能失败的情况。请让我发布。

输出:

   col1 col2
1:    A    Z
2:    B    Y
3:    C    X