r - 在 R 中使用 any() 和 dbplyr 进行分组数据库查询

标签 r filter dplyr dbplyr

我想仅过滤包含两个唯一字符串中的一个或多个的样本。基本上,我只想保留同一样本中至少有 1 个 al 和 1 个 ph 代码的样本。

我试图将这个 dplyr 分组过滤器复制到 dbplyr 中,但没有成功。

这是我尝试复制的成功 dplyr 代码:

library(DBI)
library(odbc)
library(dbplyr)
library(tidyverse)


al_codes <- c('al1', 'al2', 'al3', 'al4')
ph_codes <- c('ph1', 'ph2', 'ph3', 'ph4')


df <- 
tibble(
  sample = c(rep('water',4), rep('surfacewater',4), rep('groundwater',4)),
  variable = c('al1', 'al2', 'al3', 'ph1', 'al1', 'al2', 'al3', 'al4', 'ph1', 'ph2', 'ph3', 'ph4')
)


# want to pull only records that have at least one al and one ph test code in same sample
df %>% 
  group_by(sample) %>%
  filter(any(al_codes %in% variable) & any(ph_codes %in% variable))

# A tibble: 4 x 2
# Groups:   sample [1]
# sample variable
# <chr>  <chr>   
# 1 water  al1     
# 2 water  al2     
# 3 water  al3     
# 4 water  ph1     

此方法仅正确过滤“水”样本,因为它的 al_codesph_codes 的数量 >=1。

但是,当我尝试在 dbplyr 查询中将其复制到 Oracle 数据库时,出现以下错误:

tbl(con, from =in_schema('DWH_DBA','DWH_ALL_SAMPLE_RESULTS')) %>% 
  group_by(SAMPLE_ID) %>%
  filter(any(al_test_codes %in% TEST_CODE) & any(ph_test_codes %in% TEST_CODE))

Error: nanodbc/nanodbc.cpp:1617: HY000: [Oracle][ODBC][Ora]ORA-00936: missing expression
...

任何有关如何在 dbplyr 中完成此操作的建议将不胜感激。

session 信息:

R版本3.6.3(2020-02-29)

DBI_1.1.0; odbc_1.2.2; dbplyr_1.4.2; tidyverse_1.3.0

最佳答案

这是一个可行的选项

library(dbplyr)
tb1 %>%
  group_by(sample) %>%
  filter(sum(variable %in% al_codes, na.rm = TRUE) > 0 & 
         sum(variable %in% ph_codes, na.rm = TRUE) > 0)

-输出

# Source:   lazy query [?? x 2]
# Database: sqlite 3.30.1 [:memory:]
# Groups:   sample
#  sample variable
#  <chr>  <chr>   
#1 water  al1     
#2 water  al2     
#3 water  al3     
#4 water  ph1     

数据

con <- DBI::dbConnect(RSQLite::SQLite(), ":memory:")
copy_to(con, df)
tb1 <- tbl(con, "df")

关于r - 在 R 中使用 any() 和 dbplyr 进行分组数据库查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66677593/

相关文章:

R,迭代矩阵的行向量

c# - 我可以在 .Net/C# 中为 R 编写库/包吗?

使用 tidyverse 重新定位行

r - 基于模型的优化(在 mlrMBO 中)需要多少次迭代?

r - R 与 RNetCDF 的结果不一致 - 为什么?

使用另一个表过滤一个表的 SQL 查询

filter - 我没有从Elasticsearch查询中得到任何文档。有人可以指出我的错误吗?

javascript - Angularjs - 如何对多个变量进行搜索过滤器

r - case_when & %in%

r - 以编程方式重命名dplyr中的列