Arhn - архитектура программирования

R - генерировать все комбинации из 2 векторов с учетом ограничений

Я хотел бы сгенерировать все комбинации двух векторов с учетом двух ограничений: никогда не может быть более 3 символов из первого вектора, и всегда должен быть хотя бы один символ из второго вектора. Я также хотел бы изменить конечное количество символов в комбинации.

Например, вот два вектора:

vec1=c("A","B","C","D")
vec2=c("W","X","Y","Z")

Скажем, я хотел 3 символа в комбинации. Возможные приемлемые перестановки: "A" "B" "X"или "A" "Y" "Z". Недопустимой перестановкой будет: "A" "B" "C", так как нет хотя бы одного символа из vec2.

Теперь скажем, что я хотел 5 символов в комбинации. Возможные приемлемые перестановки: "A" "C" "Z" "Y" или "A" "Y" "Z" "X". Недопустимой перестановкой будет: "A" "C" "D" "B" "X", так как есть >3 символа из vec2.

Я полагаю, что мог бы использовать expand.grid для создания всех комбинаций, а затем каким-то образом подмножества, но должен быть более простой способ. Заранее спасибо!

09.05.2012

Ответы:


1

Я не уверен, что это проще, но вы можете отказаться от перестановок, которые не удовлетворяют вашим условиям с помощью этой стратегии:

  1. генерировать все комбинации из vec1, которые являются приемлемыми.

  2. генерировать все комбинации из vec2, которые являются приемлемыми.

  3. сгенерировать все комбинации, взяв одно решение из 1. + одно решение из 2. Здесь я бы потом выполнил фильтрацию с условием 3.

  4. (если вы ищете комбинации, все готово, в противном случае:) производите все перестановки букв в каждом результате.

Теперь давайте

vec1 <- LETTERS [1:4]
vec2 <- LETTERS [23:26]

## lists can eat up lots of memory, so use character vectors instead.
combine <- function (x, y) 
  combn (y, x, paste, collapse = "")

res1 <- unlist (lapply (0:3, combine, vec1))
res2 <- unlist (lapply (1:length (vec2), combine, vec2))

теперь у нас есть:

> res1
 [1] ""    "A"   "B"   "C"   "D"   "AB"  "AC"  "AD"  "BC"  "BD"  "CD"  "ABC"
[13] "ABD" "ACD" "BCD"
> res2
 [1] "W"    "X"    "Y"    "Z"    "WX"   "WY"   "WZ"   "XY"   "XZ"   "YZ"  
[11] "WXY"  "WXZ"  "WYZ"  "XYZ"  "WXYZ"

res3 <- outer (res1, res2, paste0)
res3 <- res3 [nchar (res3) == 5]

Итак, вот вы:

> res3
 [1] "ABCWX" "ABDWX" "ACDWX" "BCDWX" "ABCWY" "ABDWY" "ACDWY" "BCDWY" "ABCWZ"
[10] "ABDWZ" "ACDWZ" "BCDWZ" "ABCXY" "ABDXY" "ACDXY" "BCDXY" "ABCXZ" "ABDXZ"
[19] "ACDXZ" "BCDXZ" "ABCYZ" "ABDYZ" "ACDYZ" "BCDYZ" "ABWXY" "ACWXY" "ADWXY"
[28] "BCWXY" "BDWXY" "CDWXY" "ABWXZ" "ACWXZ" "ADWXZ" "BCWXZ" "BDWXZ" "CDWXZ"
[37] "ABWYZ" "ACWYZ" "ADWYZ" "BCWYZ" "BDWYZ" "CDWYZ" "ABXYZ" "ACXYZ" "ADXYZ"
[46] "BCXYZ" "BDXYZ" "CDXYZ" "AWXYZ" "BWXYZ" "CWXYZ" "DWXYZ"

Если вы предпочитаете, чтобы результаты были разделены на отдельные буквы:

res <- matrix (unlist (strsplit (res3, "")), nrow = length (res3), byrow = TRUE)
> res
      [,1] [,2] [,3] [,4] [,5]
 [1,] "A"  "B"  "C"  "W"  "X" 
 [2,] "A"  "B"  "D"  "W"  "X" 
 [3,] "A"  "C"  "D"  "W"  "X" 
 [4,] "B"  "C"  "D"  "W"  "X" 

(отрезать)

[51,] "C"  "W"  "X"  "Y"  "Z" 
[52,] "D"  "W"  "X"  "Y"  "Z" 

Какие у вас комбинации.

09.05.2012
  • Хм, интересное решение! Мне просто интересно.. если записи состоят из 1 символа (то есть вместо vec=letters[1:3], vec=month.name[1:4]), как мне выбрать комбинации с 3 записями (очевидно, nchar не будет работать) 09.05.2012
  • @jslefche: я вижу 2 возможности: либо перейти к спискам, либо сначала придерживаться букв (и как бы злоупотреблять ими как индикаторами уровня фактора), и как только у вас есть свои комбинации, преобразовать буквы в месяцы 10.05.2012
  • @beleites: я использовал strtrim, чтобы ограничить количество символов в каждом векторе, и использовал их для создания комбинаций. 10.05.2012
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..