簡體   English   中英

如何在R中的函數中包含正則表達式?

[英]How do I include a regular expression in a function in R?

在下面,我寫了一個函數,用於搜索向量中的特定正則表達式。 該函數始終在向量中搜索正則表達式,包括“ Beer”或“ Wine”。 現在,我想將要搜索的正則表達式(在我的示例中為“啤酒和葡萄酒”)作為附加變量包括到向量中。 我怎樣才能做到這一點?

x <- c("Beer","Wine","wine","Beer","Beef","Potato","Vacation") 
Thirsty <- function(x) {
Beer <-  grepl("Beer",x, ignore.case = TRUE)
Beer <- as.numeric(Beer == "TRUE")
Wine <-  grepl("Wine",x, ignore.case = TRUE)
Wine <- as.numeric(Wine == "TRUE")
Drink <- Beer + Wine
Drink <- as.numeric(Drink == "0")
Drink <-  abs(Drink -1)
}
    y <- Thirsty(x)
    y

可以使用以下代碼完成此操作:

x <- c("Beer","Wine","wine","Beer","Beef","Potato","Vacation") 
drinks <- c("Beer","Wine")
Thirsty <- function(x, drinks) {
  Reduce("|",lapply(drinks, function(p)grepl(p,x, ignore.case = TRUE)))
}
y <- Thirsty(x,drinks)
y

lapply遍歷各種drinks的可能性,並產生一系列邏輯矢量,每種飲料一個。 通過Reduce這些組合為單個向量。

我只是嘗試將匹配模式與|連接起來|

strings = c("Beer","Wine","wine","Beer","Beef","Potato","Vacation") 
thirstStrings = c("beer", "wine")

matchPattern = paste0(thirstStrings, collapse = "|") #"beer|wine"
grep(pattern = matchPattern, x = strings, ignore.case = T)
# [1] 1 2 3 4

您可以輕松地將其包裝在函數中

Thirsty = function(x, matchStrings){
  matchPattern = paste0(matchStrings, collapse = "|") #"beer|wine"
  grep(pattern = matchPattern, x = x, ignore.case = T)
}

Thirsty(strings, thirstStrings) # [1] 1 2 3 4

這也應該工作

Thirsty = function(vec, ...) {
  pattern = paste0(unlist(list(...)), collapse = "|")
  stringr::str_detect(tolower(vec), pattern)
}

> Thirsty (x, "beer", "wine")
[1]  TRUE  TRUE  TRUE  TRUE FALSE FALSE FALSE    

暫無
暫無

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

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