Переименовать имена строк - PullRequest
0 голосов
/ 17 февраля 2020

Я хотел бы переименовать имена строк, удалив общую часть имени строки

          a b  c
CDA_Part  1 4  4
CDZ_Part  3 4  4
CDX_Part  1 4  4

result

     a b  c
CDA  1 4  4
CDZ  3 4  4
CDX  1 4  4

Ответы [ 2 ]

2 голосов
/ 17 февраля 2020

1.Создать минимальный воспроизводимый пример :

df <- data.frame(a = 1:3, b = 4:6)
rownames(df) <- c("CDA_Part", "CDZ_Part", "CDX_Part")

df

Возвращает:

         a b
CDA_Part 1 4
CDZ_Part 2 5
CDX_Part 3 6

2. Предлагаемое решение с использованием базы Rs gsub:

rownames(df) <- gsub("_Part", "", rownames(df), fixed=TRUE)

df

Возвращает:

    a b
CDA 1 4
CDZ 2 5
CDX 3 6

Объяснение:

gsub использует regex для идентификации и замены частей строк. Три первых аргумента:

  • pattern шаблон, подлежащий замене - т.е. "_Part"
  • replacement строка, которая будет использоваться в качестве замены - т.е. пустая строка " "
  • x строка, в которой мы хотим что-то заменить - т.е. имена строк

Дополнительный аргумент (не в первых 3):

  • fixed указывает, является ли pattern регулярным выражением или «просто» обычной строкой, т.е. просто строкой
0 голосов
/ 17 февраля 2020

Вы можете попробовать этот подход, вы можете использовать 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...