В одну сторону, используя dplyr
и tidyr
library(dplyr)
library(tidyr)
df %>%
mutate(row = row_number()) %>%
separate_rows(string, sep = ";") %>%
separate(string, into = c('column', 'value'), sep = ":\\s+", fill = 'left') %>%
mutate(column = replace_na(column, 'a')) %>%
pivot_wider(names_from = column, values_from = value) %>%
select(-row)
# a ` b` ` c` ` d` ` e` ` f`
# <chr> <chr> <chr> <chr> <chr> <chr>
#1 a1 b1, b2, b3 c1, c2, c3 NA NA NA
#2 a1 b2, b3, b4 c1, c2, c3 d1, d2, d3 NA NA
#3 a2 b1, b2, b3 c2, c5, c6 d1, d2, d3 e2, e3, e4 NA
#4 a5 b5, b6, b7 c1, c2, c3 d1, d2, d3 NA NA
#5 a6 b1, b2, b3 c1, c4, c5 d1, d2, d3 e1, e2, e3 f1, f2, f3
data
df <- structure(list(string = c("a1; b: b1, b2, b3; c: c1, c2, c3",
"a1; b: b2, b3, b4; c: c1, c2, c3; d: d1, d2, d3", "a2; b: b1, b2, b3; c: c2, c5, c6; d: d1, d2, d3; e: e2, e3, e4",
"a5; b: b5, b6, b7; c: c1, c2, c3; d: d1, d2, d3", "a6; b: b1, b2, b3; c: c1, c4, c5; d: d1, d2, d3; e: e1, e2, e3; f: f1, f2, f3"
)), class = "data.frame", row.names = c(NA, -5L))