根据它们的关系在r中排序对象

时间:2012-09-17 13:21:03

标签: r dataframe permutation

我有一个包含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

有什么建议我应该怎么做?感谢。

2 个答案:

答案 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语言写这个或类似的东西)。