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

Ray*_*Ray 10 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
Run Code Online (Sandbox Code Playgroud)

为什么dplyr::filter返回0结果?(而不是第2和第4行)我正在尝试在特定的输入字符串上使用SQL等效的通配符过滤器%like%.

我究竟做错了什么?

mpa*_*nco 14

您可以使用:

filter(foo, grepl("foo", Company, fixed = TRUE))
Run Code Online (Sandbox Code Playgroud)

输出:

  Company    Metric
1     foo  9.906805
2    food 10.464493
Run Code Online (Sandbox Code Playgroud)

正如Dhawal Kapil指出的那样,我认为%like%是来自data.table:

library(data.table)
DT <- data.table(foo)
DT[Company %like% 'foo']
Run Code Online (Sandbox Code Playgroud)

输出:

   Company    Metric
1:     foo  9.906805
2:    food 10.464493
Run Code Online (Sandbox Code Playgroud)


小智 12

你可以使用库(stringr)

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

foo %>% filter(str_detect(Company,"foo"))
Run Code Online (Sandbox Code Playgroud)

以及任何其他正则表达式

foo %>% filter(str_detect(Company,"^f")) 
Run Code Online (Sandbox Code Playgroud)

  • Hadleys 表示,这从未按预期工作,现在已删除版本 dbplyr 1.4.0 https://github.com/tidyverse/dbplyr/issues/295 (3认同)

Ray*_*Ray 6

弄清楚了; 我会留下这个,以防将来帮助其他人:

foo <- foo %>% dplyr::filter(Company %like% "foo")
Run Code Online (Sandbox Code Playgroud)

如果没有原始问题中的"s foo,则返回正确的data.frame.仍然不确定你是否可以%在SQL中使用它作为锚(例如%foo或者foo%),但上面的工作是我需要它做的.

  • 从btw开始,没有人知道你有'%like%`的地方 (18认同)
  • `grepl()`没有被转换为SQL,它只能用在数据帧上.当在数据库后端使用dplyr时,`%like%`非常有用.在数据库中进行过滤对于大型表非常有用,这个表太大而无法完全加载到R中.您可以通过调用`explain()`函数来查看`dplyr`生成的SQL语句.`foo%>%filter(Company%like%"foo")%>%explain()`. (4认同)
  • @user63230 这可能取决于 dplyr 后面的数据库后端。“%like%“f%”公司”可能就是答案。 (2认同)