替换数据框列中的字符串/字符

时间:2019-06-09 19:51:25

标签: r string gsub

我在R中有一个数据帧(“ GO”),带有2列“ term”和“ gene”。 “条款”列的字符类型,并具有以下条目:

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 个答案:

答案 0 :(得分:2)

x <- "GO_CARGO_RECEPTOR"

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

{{1}仅使用sub而不是gsub,其余使用"GO_"

答案 1 :(得分:1)

仅在仅需将_替换为以特定前缀开头的字符串中的空格并删除该前缀的情况下,您也可以使用基于PCRE regex的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 demoregex demo

正则表达式详细信息

  • (?:\G(?!^)|^GO_)-与前一个匹配项(\G(?!^)或(|)末尾GO_子字符串(前缀)相匹配的非捕获组。一行的开始
  • ([^_]*)-捕获组1(此值在替换模式中用\1引用):_以外的0个或多个字符
  • _-下划线。

答案 2 :(得分:0)

借助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))