комбинации из символьной строки - PullRequest
0 голосов
/ 26 сентября 2018

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

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" - моя мысль заключалась в том, чтобы подсчитывать уникальные буквы в каждой строке и удалять, где count <3 ..., но безуспешно (используя пакет stingr).Есть предложения? </p>

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

'dataformodel' может быть filter ed, чтобы удалить строки с одинаковыми буквами

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)
0 голосов
/ 26 сентября 2018
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 является безопасным и разумным, поскольку мы знаем, что все его входные данные относятся к одному классу
...