комбинации из строки символов

Обновить

December 2018

Просмотры

54 раз

1

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

inputdata <- c("A1", "A2", "A3", "B1", "B2", "B3", "C1", "C2", "C3")

Вывод будет выглядеть следующим образом:

  outputdata <- c("A1 + B1 + C1", "A2 + B1 + C1","A3 + B1 + C1", "A1 + B2 + C1", "A1 + B3 + C1", "A1 + B1 + C2", "A1 + B1 + C3", "A2 + B2 + C1", "A2 + B2 + C2", "A3 + B2 + C2", "A3 + B3 + C2", "A3 + B3 + C3")

Я получил большую часть пути через этот код:

  library(gtools)
  dataformodel <- data.frame(combinations(9,3,inputdata))
  dataformodel$x <- apply( dataformodel[, ] , 1 , paste , collapse = "+" )
  dataformodel <- dataformodel[, -c(1:3)]

Проблема здесь в том , что одни и те же буквы повторяются , например. "A1 + A2 + B1"- моя мысль была сосчитать уникальные буквы в каждой строке и удалить , где граф <3 ... но не было никакой удачи ( с использованием пакета stingr). Какие-либо предложения?

2 ответы

3

«Dataformodel» может быть filterэд для удаления строк , которые имеют такое же письмо

dataformodel <- dataformodel[!apply(sapply(dataformodel, 
      sub, pattern = "\\d+", replacement = ""), 1, anyDuplicated),]

а затем применить код в OP, чтобы получить выход

head(dataformodel)
#[1] "A1+B1+C1" "A1+B1+C2" "A1+B1+C3" "A1+B2+C1" "A1+B2+C2" "A1+B2+C3"

Более быстрый подход будет использовать RcppAlgos

library(RcppAlgos)
dataformodel <-  comboGeneral(inputdata, m = 3, repetition = FALSE)
3
split(inputdata, substr(inputdata,1,1))
# $A
# [1] "A1" "A2" "A3"
# $B
# [1] "B1" "B2" "B3"
# $C
# [1] "C1" "C2" "C3"

Если мы называем expand.gridна это, мы можем это даст нам каждую комбинацию каждого A, Bи C:

head( do.call(expand.grid, split(x, substr(x,1,1))) )
#    A  B  C
# 1 A1 B1 C1
# 2 A2 B1 C1
# 3 A3 B1 C1
# 4 A1 B2 C1
# 5 A2 B2 C1
# 6 A3 B2 C1

Теперь мы можем только paste(..., collapse="+")это:

apply(do.call(expand.grid, split(x, substr(x,1,1))), 1, paste, collapse="+")
#  [1] "A1+B1+C1" "A2+B1+C1" "A3+B1+C1" "A1+B2+C1" "A2+B2+C1" "A3+B2+C1"
#  [7] "A1+B3+C1" "A2+B3+C1" "A3+B3+C1" "A1+B1+C2" "A2+B1+C2" "A3+B1+C2"
# [13] "A1+B2+C2" "A2+B2+C2" "A3+B2+C2" "A1+B3+C2" "A2+B3+C2" "A3+B3+C2"
# [19] "A1+B1+C3" "A2+B1+C3" "A3+B1+C3" "A1+B2+C3" "A2+B2+C3" "A3+B2+C3"
# [25] "A1+B3+C3" "A2+B3+C3" "A3+B3+C3"

Заметки:

  • если данные велико, то expand.gridможет не хватить памяти;
  • это один из немногих случаев , когда я думаю , что applyна data.frameэто безопасно и разумно, так как мы знаем , что все его входы одного и того же класса