【问题标题】:why the syntax of sqldf is wrong为什么sqldf的语法错误
【发布时间】:2019-05-23 02:06:01
【问题描述】:

我尝试以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]”附近:语法错误

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

【问题讨论】:

  • 这是因为您的 Interpairs 是您的 R 变量。使用 pastesprintf 在 SQL 语句中传递这些变量。见这里:stackoverflow.com/questions/17435086/…
  • sqldf 神奇地弥合了帧的存在/名称(作为伪表)的差距,但不会弥合其他变量的差距。你也可以考虑glue::glue_sql
  • 我不建议为此使用胶水或其他附加包。 sqldf 已经包含从 gsubfn 包导入并导出回来的工具,因此您不需要显式加载它。请参阅我的答案以了解首选方法。
  • 感谢您的帮助。我用 MKa 和 Grothendieck 推荐的方法把它弄明白了。这是代码:fn$sqldf("select * from Interact where miRNA= '`Interplym$microRNA[1]`' and Seqname = '`Interplym$circRNA[1]`' ")

标签: r syntax sqldf


【解决方案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 的字符串,请将@​​987654330@ 参数添加到上述任何sqldf 调用中。

更多信息

sqldf github主页上有几个这样的例子:https://github.com/ggrothendieck/sqldf

也可以通过?fn 找到fn$ 的信息。请注意,这是一个通用工具,几乎可以用于任何功能,而不仅仅是sqldf。例如,

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

【讨论】:

  • 谢谢,格洛腾迪克。但我仍然对不同的结果感到困惑:
  • R fn$sqldf("select * from Interact where miRNA= '`Interpairs$microRNA[1]`' and Seqname = '`Interpairs$circRNA[1]`' ") \n > [1] miRNA Free Energy Seqname (或 row.names 的 0-length)\n R fn$sqldf("select * from Interact where miRNA= 'hsa-miR-510-5p' and Seqname = 'chr3:195780289-195787118-' ") miRNA Free Energy Seqname 1 hsa-miR-510 -5p -21.73 chr3:195780289-195787118- 2 hsa-miR-510-5p -15.08 chr3:195780289-195787118-
  • 排名顺序是否有可能归因于变化?
  • 关于您评论中报告的结果,如果您需要帮助,您可以在报告错误或意外结果时提供可重现的输入,以便我们可以重现它。您是否检查了字符串根据答案中的说明,您认为是什么?你确定你的价值观是性格而不是因素吗?其他?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-14
  • 2018-08-26
  • 2018-06-28
  • 2015-02-11
  • 2016-11-02
  • 2014-04-30
相关资源
最近更新 更多