在 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
我知道使用 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