我遇到了一个问题,在这个问题上,我调用sqldf对添加的行进行更新。我已经阅读了sqldf文档并遵循了它们的示例,没有出现超出常规的“必须使用dbExecute()”的警告。但是,不管我如何更改语句,即使是非常简单的语句,它也会忽略更新。
```{r}df$DiscPric =0
股长(df,5)
sqldf(c(“DiscPric = NumOfItems >= 5”中的总计*0.9))
sqldf(c(“更新df集DiscPric = NumOfItems < 5"))
下面是在alter之前创建的数据帧、添加的新列和更新。我不知道语法是否错误,但它并没有标记它。当我试图切换到一个更简单的更新时,比如“=0其中的InvoiceId = 1”,它也会忽略这个简单的更新


网址:7wy3q.png
发布于 2021-06-20 17:03:05
sqldf不更新R中的变量,它只是将数据导入sqlite,然后进行处理。如果希望更新替换R版本的df,则需要运行两个查询并覆盖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,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函数):
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)https://stackoverflow.com/questions/68058107
复制相似问题