我正在尝试在dplyr中做一个过滤器,其中一列就像某些观察结果。 我可以将 sqldf 用作
Test <- sqldf("select * from database
Where SOURCE LIKE '%ALPHA%'
OR SOURCE LIKE '%BETA%'
OR SOURCE LIKE '%GAMMA%'")
我尝试使用以下不返回任何结果的方法:
database %>% dplyr::filter(SOURCE %like% c('%ALPHA%', '%BETA%', '%GAMMA%'))
谢谢
您可以将grepl
与 ALPHA|BETA|GAMMA
一起使用,如果 SOURCE 列中包含三种模式中的任何一种,这将匹配。
database %>% filter(grepl('ALPHA|BETA|GAMMA', SOURCE))
如果希望它不区分大小写,请在 grepl
中添加ignore.case = T
。
%like%
来自data.table
包。您可能还看到以下警告消息:
Warning message:
In grepl(pattern, vector) :
argument 'pattern' has length > 1 and only the first element will be used
%like%
运算符只是 grepl
函数的包装器,该函数使用正则表达式进行字符串匹配。所以%
不是必需的,事实上它们代表字面百分号。
您一次只能提供一个匹配的模式,因此要么使用正则表达式'ALPHA|BETA|GAMMA'
将它们组合在一起(如 Psidom 建议的那样),要么将测试分解为三个语句:
database %>%
dplyr::filter(
SOURCE %like% 'ALPHA' |
SOURCE %like% 'BETA' |
SOURCE %like% 'GAMMA'
)
基于Psidom和Nathan Werth的回应,对于Tidyverse友好和简洁的方法,我们可以做到;
library(data.table); library(tidyverse)
database %>%
dplyr::filter(SOURCE %ilike% "ALPHA|BETA|GAMMA") # ilike = case insensitive fuzzysearch