【问题标题】:RSQLite parametrised query with vectors as parameters以向量为参数的 RSQLite 参数化查询
【发布时间】:2019-08-20 15:14:16
【问题描述】:

我不熟悉SQL 及其语法,我无法理解如何使用RSQLite 将多个值(例如向量或列表)传递给R 中的参数化查询中的单个参数。

我有一个包含来自 RNASeq 数据的数据的两个表数据库 (myTCGA)。第一个(tcga_P)包含一些基因样本的表达值(FPKM),而(tcgaMeta)包含这些样本的元数据信息。

#tcga_P
      FPKM           Sample                 Tissue GeneName
5550 0.0633 TCGA-AB-2803-03A Acute_Myeloid_Leukemia  PLEKHN1
5551 0.2390 TCGA-AB-2805-03A Acute_Myeloid_Leukemia  PLEKHN1
5552 0.0253 TCGA-AB-2806-03A Acute_Myeloid_Leukemia  PLEKHN1
5553 0.0385 TCGA-AB-2807-03A Acute_Myeloid_Leukemia  PLEKHN1
5554 0.0326 TCGA-AB-2808-03A Acute_Myeloid_Leukemia  PLEKHN1
5555 0.2836 TCGA-AB-2810-03A Acute_Myeloid_Leukemia  PLEKHN1

# tcgaMeta (only few columns)
SampleIndex         SampleID        SubjectID Tumor.Type         Sample.Type
  1           0 TCGA-01-0628-11A TCGA-01-0628         OV Solid Tissue Normal
  2           1 TCGA-01-0630-11A TCGA-01-0630         OV Solid Tissue Normal
  3           2 TCGA-01-0631-11A TCGA-01-0631         OV Solid Tissue Normal

我想从tcga_P 中仅提取属于特定组的样本(例如所有肺样本)的表达值。为此,我编写了一个如下所示的查询

library(DBI)
library(RSQLite)
library(data.table)

myGene <- "PLEKHN1"
myTissue <- "lung"
myCancer <- "Lung Adenocarcinoma"
selectedSamples <- dbGetQuery(myTCGA, 
     "SELECT A.*
     FROM tcga_P A 
     WHERE A.GeneName = $gene AND
           A.Sample in (SELECT B.SampleID FROM tcgaMeta B 
                WHERE B.Tissue = $tissue AND 
                      B.`Disease.TCGA.` = $cancer )
     ",param = list(gene=myGene,tissue=myTissue,cancer=myCancer))
 # from long to wide
 selectedSamplesWide <- dcast(selectedSamples,GeneName~Sample, value.var = "FPKM",fun.aggregate = sum)

仅当我当时提供一个基因时,此查询才能正确返回值,但如果我尝试从多个基因中提取值,它将失败 (myGene &lt;- c("PLEKHN1","PSMD12"))

Error in result_bind(res@ptr, params) : 
Parameter 2 does not have length 2.

我可以循环 (sapply) 遍历向量中的基因,让 sql 一次调用一个基因并将结果绑定在一起,但我想在 sql 调用中做所有事情。

到目前为止,我尝试过

WHERE A.GeneName IN ($gene)
WHERE A.GeneName IN (SELECT C.GeneName FROM $gene C)

我还尝试将myGene 转换为data.frame 并将基因视为一列。说没有任何效果是多余的。

我错过了什么?参数是怎么传给param = list()的?

【问题讨论】:

    标签: r rsqlite


    【解决方案1】:

    在 SQL 中,具有相等性的 WHERE 子句 = 在您尝试将表达式计算为两个值时需要一个值。但是,WHEREIN 允许多个值:

    WHERE A.GeneName IN ('PLEKHN1', 'PSMD12', ...)
    

    对于无限数量的值,请考虑使用paste + collapse 动态创建准备好的语句,并使用setNamesas.list 绑定参数值:

    myGene <- c("PLEKHN1", "PSMD12")
    myTissue <- "lung"
    myCancer <- "Lung Adenocarcinoma"
    
    myPlaceHolders <- paste0("$gene", seq_along(myGene))
    
    sql <- paste0("SELECT A.*
                   FROM tcga_P A 
                   WHERE A.GeneName IN (", paste(myPlaceHolders, collapse=", "), ") 
                     AND A.Sample in (SELECT B.SampleID 
                                      FROM tcgaMeta B 
                                      WHERE B.Tissue = $tissue 
                                        AND B.`Disease.TCGA.` = $cancer)
                 ")
    
    myGeneParams <- as.list(setNames(myGene, gsub("\\$", "", myPlaceHolders)))
    paramList <- c(myGeneParams, tissue=myTissue, cancer=myCancer)
    
    selectedSamples <- dbGetQuery(myTCGA, sql, param = myParamList)
    

    Rextester demo(对于准备好的语句和参数输出不查询运行)

    【讨论】:

    • 感谢您的解决方案和清晰的解释。我不得不逃避 gsub 模式 gsub("\\$", "", myPlaceHolders),但除此之外,它还有效。
    • 很高兴听到并乐于提供帮助!
    猜你喜欢
    • 2021-12-24
    • 1970-01-01
    • 2014-09-27
    • 2017-08-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多