对一个向量中的值进行重新编码,以最大化另一向量中相同数字的对的数量

Jos*_*erg 2 optimization r matrix

我有下表,该表original_table是通过比较相同索引 和 的数字对的频率得出的vector_1vector_2

vector_1 <- c(5, 6, 5, 4, 6, 6, 4, 1, 6, 7, 5, 3, 3, 4, 4, 7, 7, 7, 2, 7, 2, 6, 1)
vector_2 <- c(1, 2, 1, 3, 4, 4, 4, 2, 4, 7, 2, 5, 5, 3, 3, 6, 7, 7, 6, 3, 6, 7, 2)
original_table <- table(vector_1, vector_2)
str(original_table)

        vector_2
vector_1 1 2 3 4 5 6 7
       1 0 2 0 0 0 0 0
       2 0 0 0 0 0 2 0
       3 0 0 0 0 2 0 0
       4 0 0 3 1 0 0 0
       5 2 1 0 0 0 0 0
       6 0 1 0 3 0 0 1
       7 0 0 1 0 0 1 3
Run Code Online (Sandbox Code Playgroud)

我正在尝试重新编码 的值,vector_1以最大化 中具有相同索引的值的相同数字对的数量vector_2。我最终尝试重新编码这些以使用Breckenridge (2000)描述的双分割交叉验证。

唯一的“规则”是每个值都必须用唯一的值重新编码,因此例如,12不能同时重新编码为。3

我已经或多或少地使用以下方式手动完成了此操作car::recode

vector_1 <- car::recode(vector_1, "6 = 4; 7 = 7; 4 = 3; 5 = 1; 3 = 5; 2 = 6; 1 = 2")
optimized_table <- table(vector_1, vector_2)
str(optimized_table)

        vector_2
vector_1 1 2 3 4 5 6 7
       1 2 1 0 0 0 0 0
       2 0 2 0 0 0 0 0
       3 0 0 3 1 0 0 0
       4 0 1 0 3 0 0 1
       5 0 0 0 0 2 0 0
       6 0 0 0 0 0 2 0
       7 0 0 1 0 0 1 3
Run Code Online (Sandbox Code Playgroud)

这样做至少有几个问题:我仔细观察了它,所以我不确定这是最大化向量之间对总数的最佳方法,并且用不同的集合不容易重现数据的。我正在寻找一种更好/更自动地完成此操作的方法,但我无法轻松找到编程或智能的方法来完成此操作。

flo*_*del 5

这称为分配问题。解决这个问题的一种方法是使用整数规划;您可以使用lpSolve::lp.assign

library(lpSolve)
res <- lp.assign(-original_table)
l <- apply(res$solution > 0.5, 1, which)
# [1] 2 6 5 3 1 4 7
Run Code Online (Sandbox Code Playgroud)

解决该问题的一种更快的先验方法是使用匈牙利算法,在包中实现clue

library(clue)
res <- solve_LSAP(original_table, maximum = TRUE)
# Optimal assignment:
# 1 => 2, 2 => 6, 3 => 5, 4 => 3, 5 => 1, 6 => 4, 7 => 7
l <- as.integer(res)
# [1] 2 6 5 3 1 4 7
Run Code Online (Sandbox Code Playgroud)

最后,您可以使用以下命令重新编码:

vector_1 <- l[vector_1]
Run Code Online (Sandbox Code Playgroud)