我有一个包含3个对象(A,B,C)的数据框,它们具有以下关系分数:
relationships<-data.frame(object.1=c("A","A","B"),object.2=c("B","C","C"),relationship=1:3)
relationships
object.1 object.2 relationship
1 A B 1
2 A C 2
3 B C 3
考虑A,B,C的所有可能的排列以及相邻对象之间的关系分数,即
A 1 B 3 C = 4
A 2 C 3 B = 5
C 2 A 1 B = 3
B 1 A 2 C = 3
B 3 C 2 A = 5
C 3 B 1 A = 4
我需要确定命令对象的对象的顺序,以便相邻对象的关系从左到右尽可能高,即上面的示例我会选择
B 3 C 2 A = 5
有什么建议我应该怎么做?感谢。
答案 0 :(得分:1)
这接近你想要的吗?
library(data.table)
relationships<-data.table(object.1=c("A","A","B"),object.2=c("B","C","C"),relationship=1:3)
relationships<-rbindlist(list(relationships,relationships[,list(object.1=object.2, object.2=object.1, relationship)]))
setkey(relationships,object.1,object.2)
perm<-CJ(C1=LETTERS[1:3],C2=LETTERS[1:3],C3=LETTERS[1:3])[!C1==C2 & !C1==C3 & !C2==C3]
setkey(perm,C1,C2)
perm[relationships,rel.1:=relationship]
setkey(perm,C2,C3)
perm[relationships,rel.2:=relationship]
perm[order(-rel.1,-rel.2)]
它不是那么可扩展,但也许可以扩展......
答案 1 :(得分:0)
它似乎是图形问题中的最短路径(即最长,但这无关紧要) - 尝试使用igraph
将输入视为真实图形,然后使用shortest.paths
为了找到最佳连接,最后选择它可以最好地实现您的降低关系标准。 (这是次优解决方案,但最佳解决方案可能需要用C语言写这个或类似的东西)。