Заменить строки / символы в столбце фрейма данных - PullRequest
0 голосов
/ 09 июня 2019

У меня есть фрейм данных ("GO") в R с 2 столбцами, "term" и "gene". Столбец «term» имеет символьный тип и имеет следующие записи:

GO_POSITIVE_REGULATION_OF_VIRAL_TRANSCRIPTION

GO_CARGO_RECEPTOR

GO_MATRIX ...

Таким образом, каждый столбец начинается с GO_ и имеет _ между словами. Я хочу удалить GO_ и заменить другие _ пробелами.

Я пытался исправить это с помощью gsub:

GO$term <- gsub('GO', '', GO$term)
GO$term <- gsub('\\_', ' ', GO$term)

Проблема в том, что, например, GO_CARGO_RECEPTOR стал CAR RECEPTOR, но мне нужно, чтобы он был CARGO RECEPTOR.

Я не знаю, как можно указать код в R, так что в этом примере удаляются только GO_ в начале и _ в середине строк ...

Спасибо за любую помощь.

Ответы [ 3 ]

2 голосов
/ 09 июня 2019
x <- "GO_CARGO_RECEPTOR"

gsub("_", " ", sub("^GO_", "", x))
[1] "CARGO RECEPTOR"

Просто используйте sub вместо gsub для "GO_" и gsub для остальных.

1 голос
/ 10 июня 2019

На тот случай, если вам нужно заменить _ только пробелами в строках, которые начинаются с определенного префикса, и также прекратить этот префикс, вы можете использовать основанный на регулярных выражениях PCRE gsub как

x <- c("GO_POSITIVE_REGULATION_OF_VIRAL_TRANSCRIPTION","POSITIVE_REGULATION_OF_VIRAL_TRANSCRIPTION")
gsub("(?:\\G(?!^)|^GO_)([^_]*)_", "\\1 ", x, perl=TRUE)
## => [1] "POSITIVE REGULATION OF VIRAL TRANSCRIPTION"
##    [2] "POSITIVE_REGULATION_OF_VIRAL_TRANSCRIPTION"

См. Демонстрацию R и демонстрацию regex .

Сведения о регулярном выражении

  • (?:\G(?!^)|^GO_) - группа без захвата, которая соответствует либо концу предыдущего совпадения (\G(?!^)), либо (|) подстроке GO_ (префикс) в начале строки
  • ([^_]*) - Группа захвата 1 (это значение упоминается как \1 из шаблона замены): любые 0 или более символов, кроме _
  • _ - подчеркивание.
0 голосов
/ 09 июня 2019

С dplyr::mutate плюс некоторыми base функциями для выполнения манипуляций во фрейме данных.

library(dplyr)
GO <- GO %>% 
  dplyr::mutate(term = base::substring(term, 4), # remove GO_
                term = base::gsub("_", " ", term))
> GO
                                        term     gene
1 POSITIVE REGULATION OF VIRAL TRANSCRIPTION 0.507617
2                             CARGO RECEPTOR 0.991978
3                                     MATRIX 0.543001

  • Данные
GO <- data.frame(term = c("GO_POSITIVE_REGULATION_OF_VIRAL_TRANSCRIPTION",
                          "GO_CARGO_RECEPTOR",
                          "GO_MATRIX"),
                 gene = runif(3))
...