微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SQLDF 更新忽略更新

如何解决SQLDF 更新忽略更新

我遇到了一个问题,我正在调用 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”,它也会忽略这个简单的更新

First DataFrame Before alter in R

After New Column is Added

After Update is Applied

.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)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?