【问题标题】:Checking if a vector starts with a number检查向量是否以数字开头
【发布时间】:2018-08-17 08:48:36
【问题描述】:

我有一个非常直截了当的问题。抱歉,如果已经在某个地方问过这个问题,但我找不到答案...... 我想检查基因名称是否以数字开头,如果它们确实以数字开头,我想在基因名称中添加“aaa_”。因此我使用了以下代码:

geneName <- "2310067B10Rik"
if (is.numeric(substring(geneName, 1, 1))) {
  geneName <<- paste("aaaa_", geneName, sep="")
}

我想找回的是aaaa_2310067B10Rik。但是,is.numeric 返回 FALSE,因为子字符串在引号中给出“2”作为字符。我也尝试过使用 noquote(),但没有用,以及子字符串周围的 as.numeric(),但它也将 if 代码应用于不以数字开头的基因。有什么建议么?谢谢!

【问题讨论】:

标签: r substring quotations


【解决方案1】:

这是一个使用正则表达式 (Learning Regular Expressions) 的解决方案:

geneName <- c("2310067B10Rik", "Z310067B10Rik")
sub("^(\\d)", "aaa_\\1", geneName)

或作为 PERL 风格的变体(感谢 @snoram):

sub("^(?=\\d)", "aaa_", geneName, perl = TRUE)

【讨论】:

  • 类似口味的替代品sub("^(?=\\d)", "aaa_", geneName, perl = TRUE)。 +1 顺便说一句。
【解决方案2】:

使用replace()函数:

start_nr <- grep("^\\d", geneName)
replace(geneName, start_nr, paste0("aaaa_", geneName[start_nr]))
[1] "aaaa_2310067B10Rik" "foo"                "aaaa_9bar"  

地点:

geneName <- c("2310067B10Rik", "foo", "9bar")

【讨论】:

    【解决方案3】:
    geneName <- c("2310067B10Rik", "foo") 
    
    ifelse(substring(geneName, 1,1) %in% c(0:9), paste0("aaaa_", geneName), geneName)
    
    [1] "aaaa_2310067B10Rik" "foo"  
    

    或者根据上述评论,您可以将substring(geneName, 1,1) %in% c(0:9) 替换为grepl("^\\d", geneName)

    【讨论】:

    【解决方案4】:

    使用regex

    您可以先检查geneName 的第一个字符,如果是数字,则可以附加如下:

    geneName <- "2310067B10Rik"
    ifelse(grepl("^[0-9]*$", substring(geneName, 1,1)),paste("aaaa",geneName,sep="_"),)
    

    输出:

    [1] "aaaa_2310067B10Rik"
    

    【讨论】:

      【解决方案5】:
       geneName=function(x){
         if( grepl("^[0-9]",x) ){
           as.character(glue::glue('aaaa_{x}'))
         }else{x}
       }
      > geneName("2310067B10Rik")
      [1] "aaaa_2310067B10Rik"
      > geneName("sdsad")
      [1] "sdsad"
      

      【讨论】:

      • 虽然此代码可能会回答问题,但提供有关它如何和/或为什么解决问题的额外上下文将提高​​答案的长期价值。
      • @Nic3500 完全同意
      猜你喜欢
      • 2023-01-01
      • 2018-02-02
      • 2011-05-24
      • 2016-01-05
      • 2012-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多