检查向量是否以数字开头

Checking if a vector starts with a number

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

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

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

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)

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

使用regex:

您可以先检查您的 geneName 的第一个字符,如果它是数字,那么您可以添加如下内容:

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

输出:

[1] "aaaa_2310067B10Rik"
 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"

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

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

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

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