dplyr筛选器(),带有类似SQL的%wildcard%

hts6caw3  于 2022-12-20  发布在  其他
关注(0)|答案(6)|浏览(114)

假设我有以下数据:

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%")

我尝试使用data.table包中的%like%操作符,对dplyr::filter的特定输入字符串使用SQL等效通配符过滤器。
我哪里做错了?

rdlzhqv9

rdlzhqv91#

您可以用途:

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
2j4z5cfb

2j4z5cfb2#

您可以与库(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"))
x3naxklr

x3naxklr3#

想通了;我想我还是把它留着吧,以防将来对别人有帮助。

library(data.table)   # For like function (%like%)
foo <- foo %>% dplyr::filter(Company %like% "foo")

如果原始问题中foo周围没有" s,则返回正确的data. frame。仍然不确定是否可以在SQL中使用%作为锚(例如%foofoo%),但上面的内容适用于我需要它做的事情。

qxsslcnc

qxsslcnc4#

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

foo$Company <- toupper(foo$Company)

然后应用过滤器

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

这将给予公司可能是的子集:

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

kx5bkwkv5#

使用dplyr + SQL的替代方法:

通过sql()从dplyr中转义,你可以直接把原生SQL(取决于你的数据库风格)放到管道中:

library(dplyr)
foo %>% filter(sql("Company LIKE ('%foo%')")
bjp0bcyl

bjp0bcyl6#

随着stringr1.5.0的更新,str_like()将使这样的过滤器变得轻而易举。

foo |> filter(str_like(Company, "foo%"))

这将根据需要过滤行。

相关问题