【问题标题】:Replace strings/characters in data frame column替换数据框列中的字符串/字符
【发布时间】:2019-06-09 19:51:25
【问题描述】:

我在 R 中有一个数据框(“GO”),有 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_和字符串中间的_被删除...

感谢您的帮助。

【问题讨论】:

  • 您只需要subsub("^GO_", "", GO$term),因为gsub 替换了“GO”的多个实例。在这里,因为它只是开始的'GO',你可以添加^来标记字符串的开始
  • 所有字符串都以GO_ 开头吗?还是仅当字符串以GO_ 开头时才需要执行这些替换?

标签: r string gsub


【解决方案1】:
x <- "GO_CARGO_RECEPTOR"

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

只需使用sub 代替gsub 来代替"GO_"gsub 其余部分。

【讨论】:

  • 为什么gsub 会失败,例如gsub("_", " ", gsub("^GO_", "", x))
【解决方案2】:

使用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))

【讨论】:

    【解决方案3】:

    以防万一您只需要用以特定前缀开头的字符串中的空格替换 _ 并删除此前缀,您可以使用基于 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 demoregex demo

    正则表达式详细信息

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-10-13
      • 2019-12-28
      • 1970-01-01
      • 2013-05-08
      • 2016-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多