为什么sqldf的语法错误

时间:2019-05-23 02:06:01

标签: r syntax sqldf

我试图以R语言(3.6)的批处理方式从数据框中选择特定数据,但是失败了。

当我使用

sqldf("select * from Interact where miRNA = 'hsa-miR-510-5p' and
       Seqname ='chr3:195780289-195787118-' ")

事实证明还可以。

我尝试了

sqldf("select * from Interact where miRNA = Interpairs[1,1] and 
       Seqname =Interpairs[1,2]"), 

sqldf('select * from Interact where miRNA = Interpairs$microRNA[1] and 
      Seqname = Interpairs$circRNA[1]')

事实证明是错误的。

  

result_create(conn @ ptr,statement)中的错误:靠近“ [1]”:语法错误

我想知道是否有人可以帮助解决这个问题?

1 个答案:

答案 0 :(得分:1)

传递给sqldf的字符串必须是SQL。您可以做的是,如图所示在sqldf前面加上fn$来插入相关内容,然后在反引号内的代码将由R执行,并在传递该字符串之前将其输出替换为sql字符串。到sqldf

library(sqldf)
DF <- data.frame(a = 'x', b = 'y', stringsAsFactors = FALSE) # test data

fn$sqldf("select * from DF where a = '`DF$a[1]`' and b = '`DF$b[1]`' ")
##   a b
## 1 x y

fn$sqldf("select * from DF where a = '`DF[1,1]`' and b = '`DF[1,2]`' ")
##   a b
## 1 x y

如果变量名称不包含某些特殊字符,$variable也将替换变量的内容:

a <- DF$a[1]
b <- DF$b[1]
fn$sqldf("select * from DF where a = '$a' and b = '$b' ")
##   a b
## 1 x y

如果您想查看实际传递给sqldf的字符串,则将verbose = TRUE自变量添加到上述任何sqldf调用中。

更多信息

在sqldf github主页上有几个示例:https://github.com/ggrothendieck/sqldf

有关fn$的信息也可以通过?fn找到。请注意,这是一种通用功能,几乎可以与任何功能一起使用,而不仅限于sqldf。例如,

w <- "world"
fn$cat("Hello, $w\n")
## Hello, world