Вот подход data.table
. Я боролся с этим, поэтому код НАИБОЛЕЕ НЕ САМЫЙ / элегантный. Он должен работать независимо от того, сколько ../ .. вариантов представлено в строке (не проверено).
Я открыт для всех улучшений ..
но, похоже, задание выполнено ...
образец данных
library( data.table)
DT <- structure(list(keyword = c("deltoid muscle", "teres major/minor muscle",
"latissimus dorsi muscle", "serratus anterior/posterior superior/inferior muscle",
"levator scapulae", "rhomboid major/minor muscle", "erector spinae muscle",
"thoracolumbar fascia.", "Bone â\200“", "Clavicle:")), row.names = c(NA,
-10L), class = c("tbl_df", "tbl", "data.frame"))
код
setDT( DT )
#cut string into parts
DT[, paste0( "part_", 1:length( tstrsplit( gsub("([a-z]+\\/[a-z]+)", "~\\1~", DT$keyword ), "~" ) ) ) :=
tstrsplit( gsub("([a-z]+\\/[a-z]+)", "~\\1~", DT$keyword ), "~" ) ][]
#replace all NA with %-sing (or any other sign that does NOT appear in your data!!)
#it can be removed later on
DT[ is.na(DT) ] <- "%"
#split all .../... values to a vector
cols = grep( "^part_", names(DT), value = TRUE )
DT[, (cols) := lapply( .SD, strsplit, "/" ), .SDcols = cols ][]
#now throw it all together
answer <- data.table::rbindlist( lapply( transpose( DT[, .SD, .SDcols = cols ] ), function(x) do.call( expand.grid, x ) ) )
answer[, final := Reduce( function(...) paste0(..., sep = ""), .SD[, mget(cols)])]
#now remove the "%"-sing
gsub( "%", "", answer$final )
вывод
выглядит нормально ...
# [1] "deltoid muscle" "teres major muscle" "teres minor muscle"
# [4] "latissimus dorsi muscle" "serratus anterior superior muscle" "serratus posterior superior muscle"
# [7] "serratus anterior inferior muscle" "serratus posterior inferior muscle" "levator scapulae"
# [10] "rhomboid major muscle" "rhomboid minor muscle" "erector spinae muscle"
# [13] "thoracolumbar fascia." "Bone –" "Clavicle:"