【问题标题】:Ordering objects in r based on their relationships根据它们的关系对 r 中的对象进行排序
【发布时间】:2012-09-17 13:21:03
【问题描述】:

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

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

【问题讨论】:

  • 您可以找到relationship 的最大值,如果有多个,请查看A 的最大值,然后是B,最后如果仍然是平局,则在C。

标签: r dataframe permutation


【解决方案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)]

它的扩展性不是很好,但也许可以扩展......

【讨论】:

    【解决方案2】:

    这似乎是图问题中的最短路径(即最长,但这没关系)——尝试使用igraph 将您的输入视为真实图,然后使用shortest.paths 找到最佳连接,最后选择最能实现你的递减关系标准的这个。 (这是次优解决方案,但最佳解决方案可能需要用 C 或类似的语言编写)。

    【讨论】:

      猜你喜欢
      • 2021-02-07
      • 2016-07-04
      • 1970-01-01
      • 1970-01-01
      • 2018-11-20
      • 2013-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多