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 在其架构中使用已经存在的表。
不过,在紧要关头,您可以直接在 R 中执行此操作而无需 sqldf,以防这不是一个简化的示例:
x$DiscPric <- x$Total * ifelse(x$NumOfItems >= 5, 0.9, 1)