首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >忽略更新的SQLDF更新

忽略更新的SQLDF更新
EN

Stack Overflow用户
提问于 2021-06-20 16:52:27
回答 1查看 44关注 0票数 0

我遇到了一个问题,在这个问题上,我调用sqldf对添加的行进行更新。我已经阅读了sqldf文档并遵循了它们的示例,没有出现超出常规的“必须使用dbExecute()”的警告。但是,不管我如何更改语句,即使是非常简单的语句,它也会忽略更新。

代码语言:javascript
复制
```{r}

df$DiscPric =0

股长(df,5)

sqldf(c(“DiscPric = NumOfItems >= 5”中的总计*0.9))

sqldf(c(“更新df集DiscPric = NumOfItems < 5"))

代码语言:javascript
复制

下面是在alter之前创建的数据帧、添加的新列和更新。我不知道语法是否错误,但它并没有标记它。当我试图切换到一个更简单的更新时,比如“=0其中的InvoiceId = 1”,它也会忽略这个简单的更新

网址:7wy3q.png

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-06-20 17:03:05

sqldf不更新R中的变量,它只是将数据导入sqlite,然后进行处理。如果希望更新替换R版本的df,则需要运行两个查询并覆盖df

类似于:

代码语言:javascript
复制
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"))

或者更简洁一些:

代码语言:javascript
复制
df$DiscPric = 0
head(df,5)

DF <- sqldf(c("UPDATE df SET DiscPric = Total*0.9 Where NumOfItems >= 5",
              "UPDATE main.df SET DiscPric = Total Where NumOfItems < 5",
              "SELECT * from main.df"))

或者使用case when ... then ... end (一个SQL函数):

代码语言:javascript
复制
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中这样做,以防这不是一个简化的示例:

代码语言:javascript
复制
x$DiscPric <- x$Total * ifelse(x$NumOfItems >= 5, 0.9, 1)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68058107

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档