我有一个大约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个左右)。
有任何优雅的方法吗?
答案 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)