Как получить все комбинации слов из нескольких сегментов?

#r #combinations

#r #комбинации

Вопрос:

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

 a <- c("chicken","turkey")
b <- c("legs","wings")
  

и я хочу получить что-то вроде этого:

 "chicken.*legs|legs.*chicken|chicken.*wings|wings.*chicken|turkey.*legs|legs.*turkey|turkey.*wings|wings.*turkey"
  

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

Комментарии:

1. Сколько у вас наборов?

2. @ekoam Я хочу получить надежный метод, который будет работать для неопределенного количества наборов. Спасибо за вопрос, я не упомянул об этом в сообщении.

3. Итак, давайте предположим, что есть 3 набора a , b и c . Вам нужен конечный результат, представляющий собой комбинацию из 3 наборов (например a.*b.*c|a.*c.*b ) или только из любых 2 (например a.*b|a.*c )?

4. @ekoam комбинация всех трех

Ответ №1:

Работает ли это:

 library(dplyr)
rbind(expand.grid(a, b), expand.grid(b, a)) %>% mutate(x = paste0(Var1,'.','*',Var2, collapse = '|')) %>% distinct(x) %>% pull(x)
[1] "chicken.*legs|turkey.*legs|chicken.*wings|turkey.*wings|legs.*chicken|wings.*chicken|legs.*turkey|wings.*turkey"
  

Ответ №2:

Вы можете использовать outer :

 a <- c("chicken","turkey")
b <- c("legs","wings")

paste0(c(outer(a, b, paste, sep = '.*'),
         outer(b, a, paste, sep = '.*')), collapse = '|')

#[1] "chicken.*legs|turkey.*legs|chicken.*wings|turkey.*wings|legs.*chicken|wings.*chicken|legs.*turkey|wings.*turkey"
  

Ответ №3:

Я думаю, что эта функция решает вашу проблему

 library(combinat)
library(purrr)

allcombn <- function(...) {
  out <- combinat::permn(list(...), expand.grid, stringsAsFactors = FALSE)
  out <- vapply(out, purrr::lift_dl(paste), character(1L), sep = ".*", collapse = "|")
  paste0(out, collapse = "|")
}
  

Тест со следующими векторами

 a <- c("chicken","turkey")
b <- c("legs","wings")
c <- c("x", "y", "z")
  

Вывод

 > allcombn(a, b)
[1] "chicken.*legs|turkey.*legs|chicken.*wings|turkey.*wings|legs.*chicken|wings.*chicken|legs.*turkey|wings.*turkey"

> allcombn(a, b, c)
[1] "chicken.*legs.*x|turkey.*legs.*x|chicken.*wings.*x|turkey.*wings.*x|chicken.*legs.*y|turkey.*legs.*y|chicken.*wings.*y|turkey.*wings.*y|chicken.*legs.*z|turkey.*legs.*z|chicken.*wings.*z|turkey.*wings.*z|chicken.*x.*legs|turkey.*x.*legs|chicken.*y.*legs|turkey.*y.*legs|chicken.*z.*legs|turkey.*z.*legs|chicken.*x.*wings|turkey.*x.*wings|chicken.*y.*wings|turkey.*y.*wings|chicken.*z.*wings|turkey.*z.*wings|x.*chicken.*legs|y.*chicken.*legs|z.*chicken.*legs|x.*turkey.*legs|y.*turkey.*legs|z.*turkey.*legs|x.*chicken.*wings|y.*chicken.*wings|z.*chicken.*wings|x.*turkey.*wings|y.*turkey.*wings|z.*turkey.*wings|x.*legs.*chicken|y.*legs.*chicken|z.*legs.*chicken|x.*wings.*chicken|y.*wings.*chicken|z.*wings.*chicken|x.*legs.*turkey|y.*legs.*turkey|z.*legs.*turkey|x.*wings.*turkey|y.*wings.*turkey|z.*wings.*turkey|legs.*x.*chicken|wings.*x.*chicken|legs.*y.*chicken|wings.*y.*chicken|legs.*z.*chicken|wings.*z.*chicken|legs.*x.*turkey|wings.*x.*turkey|legs.*y.*turkey|wings.*y.*turkey|legs.*z.*turkey|wings.*z.*turkey|legs.*chicken.*x|wings.*chicken.*x|legs.*turkey.*x|wings.*turkey.*x|legs.*chicken.*y|wings.*chicken.*y|legs.*turkey.*y|wings.*turkey.*y|legs.*chicken.*z|wings.*chicken.*z|legs.*turkey.*z|wings.*turkey.*z"
  

Ответ №4:

Мы можем использовать rep для этого

 paste0(c(paste(rep(a, length(b)), b, sep =".*"),
       paste(rep(b, length(a)), a, sep=".*")), collapse="|")
#[1] "chicken.*legs|turkey.*wings|chicken.*legs|turkey.*wings|legs.*chicken|wings.*turkey|legs.*chicken|wings.*turkey"
  

данные

 a <- c("chicken","turkey")
b <- c("legs","wings")