问题描述
我遇到了一个问题,我正在调用 sqldf 对添加的行进行更新。我已经阅读了 sqldf 文档并遵循了他们的示例,并且没有出现超出正常“必须使用 dbExecute()”的警告。但是,无论我如何更改语句,即使是非常简单的事情,它也会忽略更新。
```{r}
df$discPric = 0
head(df,5)
sqldf(c("UPDATE df SET discPric = Total*0.9 Where NumOfItems >= 5"))
sqldf(c("UPDATE df SET discPric = Total Where NumOfItems < 5"))
```;
以下是更改前创建的数据框、添加的新列和更新。我不知道语法是否错误,但它没有标记它。当我尝试切换到更简单的更新时,例如“UPDATE df SET Total = 0 Where InvoiceId = 1”,它也会忽略这个简单的更新
.com/7wy3q.png解决方法
sqldf
不会更新 R 中的变量,它只是将数据导入 sqlite 然后进行处理。如果您希望更新替换 df
的 R 版本,您需要运行两个查询并覆盖 df
。
类似于:
df$DiscPric = 0
head(df,5)
DF <- sqldf(c("UPDATE df SET DiscPric = Total*0.9 Where NumOfItems >= 5","SELECT * from main.df"))
DF <- sqldf(c("UPDATE df SET DiscPric = Total Where NumOfItems < 5","SELECT * from main.df"))
或者更简洁:
df$DiscPric = 0
head(df,"UPDATE main.df SET DiscPric = Total Where NumOfItems < 5","SELECT * from main.df"))
或使用 case when ... then ... end
(一个 SQL 函数):
df$DiscPric = 0
head(df,5)
DF <- sqldf(c("UPDATE df SET DiscPric = Total * (case when NumOfItems >= 5 then 0.9 else 1 end)","SELECT * from main.df"))
请参阅 https://github.com/ggrothendieck/sqldf#8-why-am-I-having-problems-with-update 以获得更多解释(向下滚动到第 8 个标题,该链接并不总是将您带到 github 中)。
请注意,main.
在第二个(和后续)查询中必需(并且不能在第一个查询中)。如果没有它,第二个查询中的 sqldf
将再次从 R 环境中提取 df
,忽略来自第一个查询的更新。 main.
是 sqlite 的数据库名称,因此它告诉 sqlite/sqldf
使用其架构中已经存在的表。
不过,在紧要关头,您可以在没有 sqldf
的情况下直接在 R 中执行此操作,以防这不是一个简化示例:
x$DiscPric <- x$Total * ifelse(x$NumOfItems >= 5,0.9,1)