#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")