使用dplyr过滤SQLite数据库时,是否应避免使用`| `?
在R中使用dplyr筛选SQLite数据库时,我遇到了一些意外行为。下面是我看到的示例:使用dplyr过滤SQLite数据库时,是否应避免使用`| `?,r,sqlite,filter,dplyr,R,Sqlite,Filter,Dplyr,在R中使用dplyr筛选SQLite数据库时,我遇到了一些意外行为。下面是我看到的示例: library(dplyr) # Some test data df <- tbl_df(data.frame( v1 = c('a', 'b', 'a', 'b'), v2 = c('b', 'a', 'a', 'b'), v3 = month.abb[1:4])) db <- copy_to(src_sqlite('example.sqlite', create = TRUE
library(dplyr)
# Some test data
df <- tbl_df(data.frame(
v1 = c('a', 'b', 'a', 'b'),
v2 = c('b', 'a', 'a', 'b'),
v3 = month.abb[1:4]))
db <- copy_to(src_sqlite('example.sqlite', create = TRUE), df)
filter(df, v1 == 'a' | v2 == 'a', v3 == 'Jan')
# Source: local data frame [1 x 3]
#
# v1 v2 v3
# 1 a b Jan
filter(db, v1 == 'a' | v2 == 'a', v3 == 'Jan')
# Source: sqlite 3.8.6 [example.sqlite]
# From: df [2 x 3]
# Filter: v1 == "a" | v2 == "a", v3 == "Jan"
#
# v1 v2 v3
# 1 a b Jan
# 2 a a Mar
使用dplyr在数据库中工作时应避免使用|
更新:
如果你这样做
filter(db, v1 == 'a' | v2 == 'a', v3 == 'Jan') %>% show_query()
你会看到它变成了
<SQL>
SELECT "v1", "v2", "v3"
FROM "df"
WHERE "v1" = 'a' OR "v2" = 'a' AND "v3" = 'Jan'
您可以添加自己的括号以避免问题
filter(db, (v1 == 'a' | v2 == 'a'), v3 == 'Jan') %>% show_query()
# <SQL>
# SELECT "v1", "v2", "v3"
# FROM "df"
# WHERE ("v1" = 'a' OR "v2" = 'a') AND "v3" = 'Jan'
filter(db, (v1 == 'a' | v2 == 'a'), v3 == 'Jan')
# Source: sqlite 3.8.6 [example.sqlite]
# From: df [1 x 3]
# Filter: (v1 == "a" | v2 == "a"), v3 == "Jan"
#
# v1 v2 v3
# 1 a b Jan
如果在SQL中有多个条件,我不确定dplyr为什么不隐式地为您添加括号,因为它似乎确实为data.frame正确地计算了这些条件。你可以考虑看看官方的立场是什么,因为对我来说,它看起来像个虫子。< / P>这绝对是个bug。
WHERE "v1" = 'a' OR ("v2" = 'a' AND "v3" = 'Jan')
filter(db, (v1 == 'a' | v2 == 'a'), v3 == 'Jan') %>% show_query()
# <SQL>
# SELECT "v1", "v2", "v3"
# FROM "df"
# WHERE ("v1" = 'a' OR "v2" = 'a') AND "v3" = 'Jan'
filter(db, (v1 == 'a' | v2 == 'a'), v3 == 'Jan')
# Source: sqlite 3.8.6 [example.sqlite]
# From: df [1 x 3]
# Filter: (v1 == "a" | v2 == "a"), v3 == "Jan"
#
# v1 v2 v3
# 1 a b Jan