Вы можете попробовать этот подход, вы можете использовать Reduce with intersect для определения общих частей в имени. Заметьте, здесь я предполагаю, что у вас есть структура, как показано ниже в вашем наборе данных, где подчеркивание - это разделитель между двумя словами. Это решение будет работать как с word_commonpart
, так и с commonpart_word
, как в примере ниже.
Logi c: используя strsplit, разделяйте подчеркивание столбцов на основе столбцов (не есть Подчеркните также, так что использовали осмотр утверждений нулевой ширины), теперь используя Reduce, чтобы найти пересечение между строками всех имен строк. Найденные затем вставляются как регулярные выражения с элементами, разделенными трубами, и заменяются на Nothing с помощью gsub.
Ввод :
structure(list(a = 1:4, b = 4:7), class = "data.frame", row.names = c("CDA_Part",
"CDZ_Part", "CDX_Part", "Part_ABC"))
Решение:
red <- Reduce('intersect', strsplit(rownames(df),"(?=_)",perl=T))
##1. determining the common parts
e <- expand.grid(red, red)
##2. getting all the combinations of underscores and the remaining parts
rownames(df) <- gsub(paste0(do.call('paste0', e[e$Var1!=e$Var2,]), collapse = "|"), '', rownames(df))
##3. filtering only those combinations which are different and pasting together using do.call
##4. using paste0 to get regex seperated by pipe
##5.replacing the common parts with nothing here
Выход :
> df
# a b
# CDA 1 4
# CDZ 2 5
# CDX 3 6
# ABC 4 7