如何将grep / regex命令列表传递给R函数

时间:2014-07-24 07:29:55

标签: regex r grep

我有一个大约50个有点复杂的grepl命令字符串的列表,我想传递给R中的函数。我正在使用这些函数来对数据帧进行子集化。以下是两个命令的示例:

t <- subDF[grepl("(extreme|abnormal|unseasonably|unusually|record|excessive) (heat|warm|high temp)",subDF$EVTYPE),]

t <- subDF[grepl("fl(oo)?d",subDF$EVTYPE) & !grepl("flash",subDF$EVTYPE) & !grepl("(tidal|beach|(c(oa)?sta?l))(/tidal)? ?(flood)",subDF$EVTYPE),]

所以,在这个例子中,我希望将这两个grepl命令传递给一个函数,该函数将在dataframe subDF上执行此子集化(再传递其他48个左右)。

有任何优雅的方法吗?

2 个答案:

答案 0 :(得分:1)

以下是使用quote创建两个未经评估的grepl来电的示例。然后使用sapply eval电话对其进行评估。

> fruits <- c("one apple", "two pears", "three bananas")
> QQ <- list(q1 = quote(grepl("(one)|(apple)", fruits)),
             q2 = quote(grepl("apple", fruits) | grepl("bananas|one", fruits)))
> sapply(QQ, function(x) fruits[eval(x)])
#$q1
#[1] "one apple"
# 
#$q2
#[1] "one apple"     "three bananas"

查看QQ

#$q1
#grepl("(one)|(apple)", fruits)
#
#$q2
#grepl("apple", fruits) | grepl("bananas|one", fruits)

其他有用的东西是

> as.list(quote(grepl("one|apple", fruits)))
# [[1]]
# grepl
#
# [[2]]
# [1] "one|apple"
# 
# [[3]]
# fruits

通过这种方式,您可以通过x索引在每次迭代中替换正则表达式(或调用或[[)。

答案 1 :(得分:0)

看起来你在Reduce之后。以虹膜数据集为例:

mygrep <- function(x, df) df[grepl(x, df$Species), ]
pat <- c("setosa", "(setosa|virginica)")

Reduce(mygrep, pat, iris, right=TRUE)