簡體   English   中英

使用%in%運算符在R中進行部分字符串匹配?

[英]Partial String Match in R using the %in% operator?

我很想知道是否可以使用R中的%in%運算符進行部分字符串匹配。我知道有很多方法可以使用stringr等來查找部分字符串匹配,但是我當前的代碼使用起來更容易%in%運算符。

例如,假設此向量:

x <- c("Withdrawn", "withdrawn", "5-Withdrawn", "2-WITHDRAWN", "withdrawnn")

我希望每個都是TRUE,因為字符串包含“ Withdrawn”,但是只有第一個是TRUE:

x %in% c("Withdrawn")
[1]  TRUE FALSE FALSE FALSE FALSE

我嘗試使用正則表達式至少使它不區分大小寫,但這使所有內容都不正確:

x %in% c("(?i)Withdrawn")
[1] FALSE FALSE FALSE FALSE FALSE

因此,是否可以使用%in%運算符(可能帶有包裝器)在所有這些元素上得出TRUE? 因為它很容易tolower的()或TOUPPER(),我並不關心大小寫區分使用; 但是,對我來說重要的是,代碼將觸發“撤回”,“撤回”和“ 5撤回”。

編輯:該問題被標記為該問題的重復項; R中列表的大小寫不敏感搜索 但是,它有所不同,因為它詢問是否可以使用%in%運算符來匹配部分字符串。 鏈接的問題根本不使用%in%運算符。

%in%不支持此功能:它是match函數的包裝器,它使用相等比較建立匹配,而不是正則表達式匹配。 但是,您可以實現自己的:

`%rin%` = function (pattern, list) {
     vapply(pattern, function (p) any(grepl(p, list)), logical(1L), USE.NAMES = FALSE)
}

可以像%in%這樣使用:

〉'^foo.*' %rin% c('foo', 'foobar')
[1] TRUE

請注意,結果與您對grepl期望的工作要求有所不同:模式匹配是不對稱的 ,您不能互換左右兩側。 如果只想將列表與單個正則表達式匹配, grepl直接使用grepl

〉grepl("(?i)Withdrawn", x)
[1] TRUE TRUE TRUE TRUE TRUE

或者,如果您更喜歡使用運算符:

`%matches%` = grepl
〉"(?i)Withdrawn" %matches% x
[1] TRUE TRUE TRUE TRUE TRUE

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM