Как сгенерировать все комбинации из матрицы и присвоить каждому возможному результату уникальное значение? - PullRequest
0 голосов
/ 30 октября 2018

Предположим, у меня есть матрица

mat1<-matrix(c('b','c','q','a','z','d','t','o','p'),nrow=3,ncol=3)

Как мне создать список всех возможных комбинаций слева направо, справа налево, сверху вниз и снизу вверх? Скажем, «bc», «bcq», «qcb» и так далее. Кроме того, я назначу каждому элементу уникальный элемент в зависимости от положения слов. Например, «bc» соответствует «1112», в то время как «bcq» соответствует «1113», «qcb» соответствует «1311».

1 Ответ

0 голосов
/ 30 октября 2018

Попробуйте это:

perms <- function(vec) {
  f <- function(v0) unlist(sapply(seq_along(v0)[-1], function(i) {
    apply(combn(v0, i), 2, paste0, collapse="")
  }))
  c(vec, f(vec), f(rev(vec)))
}

unique(c(sapply(1:2, function(i) apply(m, i, perms))))
#  [1] "b"   "a"   "t"   "ba"  "bt"  "at"  "bat" "ta"  "tb"  "ab"  "tab" "c"  
# [13] "z"   "o"   "cz"  "co"  "zo"  "czo" "oz"  "oc"  "zc"  "ozc" "q"   "d"  
# [25] "p"   "qd"  "qp"  "dp"  "qdp" "pd"  "pq"  "dq"  "pdq" "bc"  "bq"  "cq" 
# [37] "bcq" "qc"  "qb"  "cb"  "qcb" "az"  "ad"  "zd"  "azd" "dz"  "da"  "za" 
# [49] "dza" "to"  "tp"  "op"  "top" "po"  "pt"  "ot"  "pot"

Вот как это работает.

apply принимает матрицу (m), ось (1 это "строки", 2 это "столбцы) и функцию (perms):

apply(m, 1, perms)
#       [,1]  [,2]  [,3] 
#  [1,] "b"   "c"   "q"  
#  [2,] "a"   "z"   "d"  
#  [3,] "t"   "o"   "p"  
#  [4,] "ba"  "cz"  "qd" 
#  [5,] "bt"  "co"  "qp" 
#  [6,] "at"  "zo"  "dp" 
#  [7,] "bat" "czo" "qdp"
#  [8,] "ta"  "oz"  "pd" 
#  [9,] "tb"  "oc"  "pq" 
# [10,] "ab"  "zc"  "dq" 
# [11,] "tab" "ozc" "pdq"

Он транспонирует вывод (это R, вздох), поэтому каждая строка (из 1) возвращается в виде столбца. Мы хотим запустить эту функцию как по строкам, так и по столбцам, поэтому мы также делаем

apply(m, 2, perms)

Я был (задним числом, "к сожалению") хитрым, используя sapply для итерации по осям, заданным apply. Следующие два достаточно похожи (по содержанию, если не точная структура):

c(apply(m,1,perms), apply(m,2,perms))
sapply(1:2, function(i) apply(m, 1, perms))

Возможно, это просто запутывает вещи ...

Последняя часть - unique(...), которая просто удаляет дубликаты.

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