您可以在模式上sapply 并进行行求和以找到您需要的内容。
注意事项:
- 我在这里将您的 SQL 式模式转换为正则表达式。
- 使用
dplyr 时,最好使用它的if_else,因为这个版本可以更好地防范不同的类输出(以及与基ifelse 相关的一些其他问题)。
- 由于
%like% 只是like 函数的中缀运算符(至少在data.table 中),为了清楚起见,我在这里使用后者(前缀版本)。
sapply(c(".*apple.*", ".*vocado.*"), like, vector = fruits)
# .*apple.* .*vocado.*
# [1,] TRUE FALSE
# [2,] TRUE FALSE
# [3,] FALSE FALSE
# [4,] FALSE TRUE
# [5,] FALSE FALSE
rowSums(sapply(c(".*apple.*", ".*vocado.*"), like, vector = fruits)) > 0
# [1] TRUE TRUE FALSE TRUE FALSE
这就是我们需要的,logical 的向量。我会为此创建一个辅助函数。
mylike <- function(x, ptns) rowSums(sapply(ptns, like, vector = x)) > 0
mylike(fruits, c(".*apple.*", ".*vocado.*"))
# [1] TRUE TRUE FALSE TRUE FALSE
mydata %>%
mutate(
group = if_else(mylike(fruits, c(".*apple.*", ".*vocado.*")), "group 1",
if_else(mylike(fruits, c(".*anana.*",".*grape.*")), "group 2", "group 3"))
)
# fruits color group
# 1 apple red group 1
# 2 pineapple yellow group 1
# 3 grape purple group 2
# 4 avocado green group 1
# 5 banana yellow group 2
但是,当我看到嵌套的ifelse/if_else 时,我建议使用case_when,因为它更具可读性,尤其是当条件数量增加时。
mydata %>%
mutate(
group = case_when(
mylike(fruits, c(".*apple.*", ".*vocado.*")) ~ "group 1",
mylike(fruits, c(".*anana.*",".*grape.*")) ~ "group 2",
TRUE ~ "group 3"
)
)
# fruits color group
# 1 apple red group 1
# 2 pineapple yellow group 1
# 3 grape purple group 2
# 4 avocado green group 1
# 5 banana yellow group 2
如果您已经有一组 SQL 模式并且不想将它们全部转换为正则表达式,这里有一个基于 https://codereview.stackexchange.com/a/36864/42300 的快速帮助函数:
# https://codereview.stackexchange.com/a/36864/42300
sql2regex <- function(ptn) {
paste0(
"^",
gsub("_", ".",
gsub("(?<!\\[)%(?!\\])", ".*", ptn, perl = TRUE)),
"$")
}
它尽量不转换[%],这是一种“逃避”百分比并使用其字面量的方法(参考:http://www.sqlserver.info/syntax/sql-server-like-with-percent-literal/)。然而,即使[% 可能看起来不完整,它也没有正确转换为^[.*$,而是仍然是^[%$,这将失败。同样,这只是一个快速破解助手功能。
mydata %>%
mutate(
group = case_when(
mylike(fruits, sql2regex(c("%pple%","%vocado%"))) ~ "group 1",
mylike(fruits, sql2regex(c("%anana%","%grape%"))) ~ "group 2",
TRUE ~ "group 3"
)
)
# fruits color group
# 1 apple red group 1
# 2 pineapple yellow group 1
# 3 grape purple group 2
# 4 avocado green group 1
# 5 banana yellow group 2