首页 > 解决方案 > R:我如何将solve_LSAP翻译成数据框?

问题描述

我正在尝试做一个大的分配问题,并且正在使用 LSAP。它有效,但我试图将输出放入数据框中,以便我可以用它做更多事情。但是,该函数的文档显示“具有行到列的最佳分配的类“solve_LSAP”的对象”,没有关于数据的更多信息。我似乎无法打开课程以将数据分解成更可用的形式。

我已经提供了他们的示例代码。

x <- matrix(c(5, 1, 4, 3, 5, 2, 2, 4, 4), nrow = 3)
y <- solve_LSAP(x, maximum = FALSE)
y

输出:

Optimal assignment:
1 => 3, 2 => 1, 3 => 2

我有 200 多个作业,而基线输出对我来说根本不可用。我怎样才能把它翻译成一个数据框,或者至少是一个看起来像下面这样的矩阵?

Row Column
 1    3
 2    1
 3    2

标签: r

解决方案


每行solve_LSAP返回列索引,因此包含重建所需的所有内容:

len <- length(y)

parsedMat <- cbind(
  1:len,
  as.integer(y)
)

parsedMat

     [,1] [,2]
[1,]    1    3
[2,]    2    1
[3,]    3    2

这可以通过以下方式转化为求解矩阵:

solvedMat <- matrix(0, nrow = len, ncol = len)
solvedMat[parsedMat] <- 1

solvedMat

     [,1] [,2] [,3]
[1,]    0    0    1
[2,]    1    0    0
[3,]    0    1    0

您还可以将其转换为一个函数,该函数将以列表的形式返回两个输出,例如:

parseClueOutput <- function(x) {

  len <- length(x)

  parsedMat <- cbind(
    1:len,
    as.integer(x)
  )

  solvedMat <- matrix(0, nrow = len, ncol = len)
  solvedMat[parsedMat] <- 1

  return(
    list(
      parsedMat = parsedMat,
      solvedMat = solvedMat
    )
  )

}

并将其用作:

parseClueOutput(y)

$parsedMat
     [,1] [,2]
[1,]    1    3
[2,]    2    1
[3,]    3    2

$solvedMat
     [,1] [,2] [,3]
[1,]    0    0    1
[2,]    1    0    0
[3,]    0    1    0

至于结构,这solve_LSAP并不是一个复杂的对象,它本质上是一个数字向量,您可以通过以下方式看到:

is.numeric(y)

[1] TRUE

或者:

str(y)

'solve_LSAP' num [1:3] 3 1 2

您还可以轻松地将solvedMatorparsedMat转换为数据框 - 例如parsedMat

setNames(as.data.frame(parsedMat), c('Row', 'Column'))

  Row Column
1   1      3
2   2      1
3   3      2

推荐阅读