我有一个这样的字符串
fileName <- 'tyi_myRef_2019_2020'我想检查fileName中是否存在以下任何字符,如果存在,则将其分配给一个对象。
myChar <- c('myPer','myRef','myYe','myQr')我这样做的方式是:
if(grepl('myPer', fileName)) {myObject <- 'myPer'}
if(grepl('myRef', fileName)) {myObject <- 'myRef'}
if(grepl('myYe', fileName)) {myObject <- 'myYe'}
if(grepl('myQr', fileName)) {myObject <- 'myQr'}
myObject
"myRef"有没有更短的方法来做这件事?
发布于 2019-07-24 22:58:59
您可以像这样使用sapply:
myObject <- myChar[sapply(myChar, function(x) {grepl(x, fileName)})]
myObject
#[1] "myRef"或者就像@g-grothendieck建议的那样更短:
myObject <- myChar[sapply(myChar, grepl, fileName)]如果你有一个以上的命中,myObject将保存所有命中,而你的if语句不是这样的,它将被覆盖。与if一样,使用myObject[length(myObject)]将获得最后一次点击。
您还可以在正则表达式中使用|并获得匹配结果,如下所示:
myObject <- sub(paste0(".*(", paste(myChar, collapse="|"), ").*"), "\\1", fileName)发布于 2019-07-24 22:56:20
一种选择是通过|将它们paste到单个字符串collapse中,并在grepl中将其作为pattern提供。|将充当OR,检查“fileName”中是否存在任何子字符串
grepl(paste(myChar, collapse="|"), fileName)或者另一种选择是提取
library(stringr)
str_extract(fileName, paste(myChar, collapse = "|"))
#[1] "myRef"如果我们需要赋值,那么
myChar[lengths(sapply(myChar, function(x) grep(x, fileName))) > 0]
#[1] "myRef"发布于 2019-07-24 23:00:41
使用stringr
res<-stringr::str_extract_all(fileName,myChar)
res[lengths(res)>0]
[[1]]
[1] "myRef"使用base
res<-Map(function(x,y) x[grep(x,y)],myChar,fileName)
res[lengths(res)>0]
$myRef
[1] "myRef"https://stackoverflow.com/questions/57185823
复制相似问题