R: Как мне перевести solve_LSAP в фрейм данных? - PullRequest
1 голос
/ 05 марта 2020

Я пытаюсь выполнить большую проблему с назначением и использую 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

1 Ответ

0 голосов
/ 05 марта 2020

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 на самом деле не сложный объект, это по сути числовой c вектор, который вы можете видеть с помощью:

is.numeric(y)

[1] TRUE

Или:

str(y)

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

Вы также можете легко превратить solvedMat или parsedMat в кадр данных - например, parsedMat:

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

  Row Column
1   1      3
2   2      1
3   3      2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...