我有一个包含成对元素的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
有什么方法可以最大化配对,以使两个列表中的每个元素都至少出现一次?
答案 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