带str_detect的dplyr过滤器返回空小标题

时间:2018-10-04 11:21:43

标签: r dplyr stringr roracle

我在R中有一个dplyr查询,该查询使用str_detect进行过滤,仅得到以字母“ KS”开头的案例,但返回空的小标题。我使用ROracle连接到Oracle数据库。

table <- tbl(con, "TABLE")

table %>% 
  filter(str_detect(COLUMN, "^KS"))

但是,如果我使用collect()生成小标题,它将起作用:

table <- collect(tbl(con, "TABLE"))

table %>% 
  filter(str_detect(COLUMN, "^KS"))

那是为什么?而如果没有收集,如何使它工作呢?我需要收集一些表格。

更新: 如果我更改它以过滤特定的列值,像这样: table %>% filter(str_detect(COLUMN, "^KS")), 有用。由于某些原因,如果没有collect(),则正则表达式将无法正常工作。

2 个答案:

答案 0 :(得分:0)

理查德·特尔福德(Richard Telford)通过评论中的链接向我指出了正确的方向。如果我改用:

table <- tbl(con, "TABLE")

table %>% 
  filter(COLUMN %like% "%KS%")

答案 1 :(得分:0)

str_detect转换成对数据库的查询可能是一个问题:

b <- tbl(con,"pays")
filter(b,str_detect(nom,"^D")) %>% explain
#<SQL>
#SELECT *
#FROM "pays"
#WHERE (STRPOS("nom", '^D') > 0)


#<PLAN>
#Seq Scan on pays  (cost=0.00..5.31 rows=74 width=13)
#  Filter: (strpos(nom, '^D'::text) > 0)

b %>% filter(str_detect(nom, "^D")) %>% count
## Source:   lazy query [?? x 1]
## Database: postgres 9.6.1 [h2izgk@localhost:5432/postgres]
#      n
#  <dbl>
#1     0

不幸的是,STRPOS(我使用的是PostgreSQL)无法识别'^'的含义,并且查询失败。所以你应该使用另一个函数,我发现`grepl很好:

filter(b,grepl("^D",nom)) %>% explain
#<SQL>
#SELECT *
#FROM "pays"
#WHERE (("nom") ~ ('^D'))


#<PLAN>
#Seq Scan on pays  (cost=0.00..4.76 rows=54 width=13)
#  Filter: (nom ~ '^D'::text)

b %>% filter(grepl("^D", nom))
## Source:   lazy query [?? x 3]
## Database: postgres 9.6.1 [h2izgk@localhost:5432/postgres]
#  nom      pays  code 
#  <chr>    <chr> <chr>
#1 DANEMARK 101   208  
#2 DOUALA   ""    120  
#3 DAKAR    ""    686  
#4 DJIBOUTI 399   262

结果正确。 在您的示例中,collect解决了该问题,因为它首先将整个表下载到R内存中,然后将str_detect应用于而不转换为SQL。但是效率不高。