【发布时间】:2017-12-29 20:34:06
【问题描述】:
抱歉标题不好,但我真的不知道如何简洁地用词。
我有一个我正在使用的数据框,其中一个项目可以属于 4 个类别中的任何一个,不限于 1 个。这是我正在使用的虚拟矩阵的一个示例:
ID <- 1:7
A <- c(1,0,0,1,1,0,0)
B <- c(0,1,0,0,1,0,1)
C <- c(0,0,0,0,0,1,1)
D <- c(1,0,1,1,0,0,0)
A_B <- (A+B > 0)*1
C_D <- (C+D > 0)*1
Cost <- c(25, 52, 11, 75, 45, 5, 34)
df <- data.frame(ID, A, B, C, D, A_B, C_D, A_B_C_D = 1, Cost)
df
ID A B C D A_B C_D A_B_C_D Cost
1 1 0 0 1 1 1 1 25
2 0 1 0 0 1 0 1 52
3 0 0 0 1 0 1 1 11
4 1 0 0 1 1 1 1 75
5 1 1 0 0 1 0 1 45
6 0 0 1 0 0 1 1 5
7 0 1 1 0 1 1 1 34
我需要组织这个数据框,使第 1 行包含 A,第 2 行包含 B,第 3 行包含 C,第 4 行包含 D,第 5 行包含 A 或 B,第 6 行包含 C 或 D,以及第7行剩下的。我不能使用arrange,因为以desc(A) 开头会自动给出1、4、5。这个问题的一个可接受的解决方案是:
Order <- c(4, 2, 7, 1, 5, 3, 6)
df[Order,]
df
ID A B C D A_B C_D A_B_C_D Cost
4 1 0 0 1 1 1 1 75
2 0 1 0 0 1 0 1 52
7 0 1 1 0 1 1 1 34
1 1 0 0 1 1 1 1 25
5 1 1 0 0 1 0 1 45
3 0 0 0 1 0 1 1 11
6 0 0 1 0 0 1 1 5
基本上,对角线需要是 7 条直线,但无论数据集如何,我都想不出如何对其进行编程以正确排序。我觉得这应该很容易,但我只是没有看到它。转置会更容易吗?
提前致谢。
【问题讨论】:
-
更多行数的逻辑是什么?
-
@akrun 永远只有 7 行,只是多次迭代:它们是
lpsolve优化的结果。优化工作使我始终能够做出“正确”的订单,我只需要简化订单。最终输出需要正确的顺序才能工作。谢谢 -
只有一种解决方案还是可以有多种解决方案?如果是后者,你在乎你得到哪一个吗?您可能必须实现一种搜索算法,该算法遍历可能的安排树,直到找到一个可行的安排。
-
@ClausWilke 排序可以有多种解决方案,只要对角线上有一个 1,顺序无关紧要。另一种算法是我害怕的哈哈。希望比我更聪明的人有一个简单的解决方案,但听起来我会开始研究算法。感谢您的帮助