Давайте сначала создадим вспомогательную функцию (из вашего input
у меня получилось stringsAsFactors = FALSE
; если это не вариант, просто добавьте as.character()
к вспомогательной функции):
char_comb <- function(aString) {
str_split(aString, pattern = ';') %>%
unlist() %>%
combn(2, paste0, collapse = ";")
}
NB - продемонстрировать вспомогательную функцию с минимальным примером запуска: char_comb(aString = "A;B;C;D")
А потом:
map2(.x = input[['col1']],
.y = input[['col2']], .f = function(idx, cell) {
if(nchar(cell) > 3) {
res <- char_comb(cell)
tibble(col1 = idx, col2 = res)
} else {
tibble(col1 = idx, col2 = cell)
}
}) %>%
bind_rows()
Result:
col1 col2
<chr> <chr>
1 example1 A;B
2 example2 A;B
3 example2 A;C
4 example2 A;D
5 example2 B;C
6 example2 B;D
7 example2 C;D
p.s. мое решение включает в себя также "A; B". Это будет тривиально исключить их в случае.
РЕДАКТИРОВАТЬ: добавление тестов.
Из комментариев видно, что @ ip2018 обеспокоен временем исполнения.
Оборачивание обоих решений в функцию ...
microbenchmark("pasqui" = res_fn(col1 = input[['col1']], col2 = input[['col2']]),
"H 1" = h1_res()
)
Результаты тестов:
Unit: milliseconds
expr min lq mean median uq max neval cld
pasqui 1.137418 1.198085 1.403278 1.297016 1.611183 2.310684 100 a
H 1 9.140376 9.811799 12.126555 10.730754 13.036842 45.186844 100 b