【问题标题】:Use any() with dbplyr for grouped database query in R将 any() 与 dbplyr 一起用于 R 中的分组数据库查询
【发布时间】:2021-03-17 16:48:08
【问题描述】:

我想只过滤包含两个唯一字符串中的一个或多个的样本。基本上,我只想保留在同一个样本中至少有一个 al 和一个 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     

这只会正确过滤“水”样本,因为它有 >=1 的 al_codesph_codes

但是,当我尝试在 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 中完成此任务的建议。

会话信息:

R 版本 3.6.3 (2020-02-29)

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

【问题讨论】:

    标签: r filter dplyr dbplyr


    【解决方案1】:

    这是一个可行的选项

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-29
      • 2012-07-23
      • 2019-02-20
      • 1970-01-01
      • 2021-11-08
      相关资源
      最近更新 更多