2015-04-01 5 views
4

У меня есть вектор, который содержит определенные словаУникальные комбинации строк

colors<-c("Yellow","Blue","Red") 

> colors 
[1] "Yellow" "Blue" "Red" 

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

> colorsCombined 
[1] "Yellow", "Blue", "Red", "YellowBlue", "YellowRed", "BlueRed", "YellowBlueRed" 

Я считаю, что YellowBlue будет таким же, как BlueYellow.

Как это сделать?

ответ

7

Один из вариантов - запустить функцию combn в цикле lapply. Вы можете определить его как свои собственные функции

allCombs <- function(x) c(x, lapply(seq_along(x)[-1L], 
          function(y) combn(x, y, paste0, collapse = "")), 
          recursive = TRUE) 

allCombs(colors) 
## [1] "Yellow" "Blue" "Red" "YellowBlue" "YellowRed" "BlueRed" "YellowBlueRed" 

Объяснения (по запросу)

В основном OP хочет вектор из всех возможных комбинаций (не перестановок), в зависимости от длины входного вектора. Таким образом, мы должны запустить функцию combn по k <- 1:length(x) и сгенерировать все комбинации для каждого k. Итак, когда k == 1, это просто оригинальный вектор, поэтому мы можем пропустить эту часть и просто конкатенировать исходный вектор, используя c. Остальные сгенерированные комбинации возвращают список векторов с разной длиной (в порядке убывания по понятным причинам), поэтому нам нужно использовать recursive = TRUE в функции c, чтобы имитировать поведение unlist и объединить результаты в один вектор ,

+1

спасибо. работает отлично! –

+2

Пожалуйста, объясните, как это работает, я не понимаю? – smci

+1

@smci добавлен пояснение, надеюсь, что теперь это яснее. –