在 R 中的 sqldf 中使用 UPDATE 语句

Using UPDATE statement in sqldf in R

我知道使用 base R 更新值更容易,但我必须在 sqldf 中进行。 我有一个数据框,我想根据条件更新一个字段。如果 column2 是 'c',则更新 column1.

中的值
column1 <- c(1,2,3,4)
column2 <- c("a","b","c","d")
temp <- data.frame(column1,column2)
sqldf("
      UPDATE temp
      set column1=100
      WHERE column2 ='c'
      ")

上面的代码给我 "data frame with 0 columns and 0 rows" 和警告消息 "In result_fetch(res@ptr, n = n) : SQL statements must be issued with dbExecute() or dbSendStatement() instead of dbGetQuery() or dbSendQuery()." 结果是 table 永远不会 updated/changed。

非常感谢您的宝贵时间。

这是已知的,也是有意为之的:sqldf从不尝试更新环境中的对象。它只是通过将数据复制到 sqlite(临时)数据库和 运行 查询来充当管道,包从不打算覆盖调用环境中的源对象。

参考 sqldf README 中的常见问题解答 8:

Although data frames referenced in the SQL statement(s) passed to sqldf are automatically imported to SQLite, sqldf does not automatically export anything for safety reasons. Thus if you update a table using sqldf you must explicitly return it as shown in the examples below.

使用您的数据:

sqldf(c("
       UPDATE temp
       set column1=100
       WHERE column2 ='c'
       ", "select * from main.temp"))
# Warning in result_fetch(res@ptr, n = n) :
#   SQL statements must be issued with dbExecute() or dbSendStatement() instead of dbGetQuery() or dbSendQuery().
#   column1 column2
# 1       1       a
# 2       2       b
# 3     100       c
# 4       4       d

(您可以安全地忽略该警告,这是因为第一个语句 returns 什么都没有。)

因此,要实际使用它在您的环境中就地更新对象,您需要自己捕获输出。

temp
#   column1 column2
# 1       1       a
# 2       2       b
# 3       3       c
# 4       4       d
temp <- suppressWarnings(sqldf(c("
      UPDATE temp
      set column1=100
      WHERE column2 ='c'
      ", "select * from main.temp")))
temp
#   column1 column2
# 1       1       a
# 2       2       b
# 3     100       c
# 4       4       d