检查向量是否以数字开头
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)
我有一个非常直接的问题。抱歉,如果这个问题已经在某处被问到,但我找不到答案...... 我想检查基因名是否以数字开头,如果它们确实以数字开头,我想将 '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)