dplyr filter(),带有类似SQL的%wildcard%

时间:2015-09-28 18:17:01

标签: r dplyr

假设我有以下数据:

foo <- data.frame(Company = c("company1", "foo", "test", "food"), Metric = rnorm(4, 10))

> foo
   Company    Metric
1 company1 10.539970
2      foo  9.487823
3     test  9.663994
4     food  9.499327

为什么以下代码返回0结果(而不是第二和第四行)?

library(dplyr)
library(data.table)

foo %>% dplyr::filter(Company %like% "%foo%")

我尝试使用dplyr::filter包中的%like%运算符对data.table的特定输入字符串使用SQL等效的通配符过滤器。

我做错了什么?

4 个答案:

答案 0 :(得分:12)

您可以使用:

filter(foo, grepl("foo", Company, fixed = TRUE))

输出:

  Company    Metric
1     foo  9.906805
2    food 10.464493

正如Dhawal Kapil所指出的,我认为%like%来自data.table

library(data.table)
DT <- data.table(foo)
DT[Company %like% 'foo']

输出:

   Company    Metric
1:     foo  9.906805
2:    food 10.464493

答案 1 :(得分:8)

您可以使用库(stringr)

library(dplyr)
library(stringr)
foo <- data.frame(Company = c("company1", "foo", "test", "food"), Metric = rnorm(4, 10))

foo %>% filter(str_detect(Company,"foo"))

以及任何其他正则表达式

foo %>% filter(str_detect(Company,"^f")) 

答案 2 :(得分:7)

想出来;如果我将来帮助其他人,我会留下这个:

foo <- foo %>% dplyr::filter(Company %like% "foo")

原始问题中没有" foo左右,返回正确的data.frame。仍不确定您是否可以将%用作SQL中的锚点(例如%foofoo%),但上述内容适用于我需要它执行的操作。

答案 3 :(得分:-1)

首先将所有记录的变量转换为相同大小写

foo$Company <- toupper(foo$Company)

然后应用过滤器

foo <- foo[Company %like% 'foo'] 

这将给出公司可能所在的子集:

WESTFOO FIRST NATION-LGS,
SPRINGER EUFOO OIL CO,
US FOO,
CITIFOO NA