即使冒着被标记为重复问题的风险,我也会问,因为我检查过的所有相关问题都不能解决我的问题......
我有一个 labs
向量,我想找到与 groups
变量中存储的 3 个组完全匹配的元素。
set.seed(1)
labs <- sample(c(rep('BC-89HX',3), rep('BC-89HX with 2% Puricare + 5% Merquat',3), rep('Own SH',4)), 10)
labs
groups <- c('BC-89HX','BC-89HX with 2% Puricare + 5% Merquat','Own SH')
我想识别“BC-89HX”组元素(不是“BC-89HX with 2% Puricare + 5% Merquat”元素)
grep(groups[1], labs, val=TRUE, fixed=TRUE) #finds more elements than the ones I need
grep(paste(groups[1],"$",sep=""), labs, val=TRUE, fixed=TRUE) #does not work
grep(paste("\\b",groups[1],"\\b",sep=""), labs, val=TRUE, fixed=TRUE) #does not work
有什么帮助吗?
最佳答案
确保“BC-89HX”是字符串中唯一的字符的解决方案,并通过 paste
ing ^
和$
我们确定起始位置和结束位置
grep(paste0("^", groups[1], "$"), labs, value=TRUE)
#[1] "BC-89HX" "BC-89HX" "BC-89HX"
在这种情况下,我们不能使用 fixed = TRUE
如^
和$
是暗示开始和结束位置的元字符。如果我们这样做fixed = TRUE
,它将把它解析为“labs”没有的文字字符
另一个选择是使用 ==
或%in%
因为我们正在比较固定字符串而不是匹配字符串中的子字符串
labs[labs == groups[1]]
#[1] "BC-89HX" "BC-89HX" "BC-89HX"
labs[labs == groups[2]]
#[1] "BC-89HX with 2% Puricare + 5% Merquat" "BC-89HX with 2% Puricare + 5% Merquat" "BC-89HX with 2% Puricare + 5% Merquat"
更新
如果我们真的想使用 grep
与 fixed = TRUE
,那么一种方法是 paste
在 pattern
中以及具有相同字符的字符串,即
labs[grep(paste0("^", groups[2], "$"), paste0("^", labs, "$"), fixed = TRUE) ]
#[1] "BC-89HX with 2% Puricare + 5% Merquat" "BC-89HX with 2% Puricare + 5% Merquat" "BC-89HX with 2% Puricare + 5% Merquat"
labs[grep(paste0("^", groups[1], "$"), paste0("^", labs, "$"), fixed = TRUE) ]
#[1] "BC-89HX" "BC-89HX" "BC-89HX"
关于R grep 使用向量中的元素的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49229558/