我经常在 dplyr 中转换数据时替换数据,尤其是在处理大型数据集时。当我使用 SQL 支持的数据集时,我不知道如何优雅地做到这一点,至少不是使用 SQLite。
我在 dplyr DB vignettes 或 SO 中找不到任何关于这个目标的讨论,这也让我想知道我所做的事情是否有问题;然而,这似乎是处理大型数据集的自然方式。
无论如何,最直观的方法是行不通的:
library(dplyr)
library(RSQLite)
db2 <- src_sqlite("trouble.sqlite", create = TRUE)
trouble <- data.frame(values = c(5, 1, 3))
trouble.db <- copy_to(db2, trouble, temporary = FALSE)
collect(trouble.db) # 5, 3, 1
trouble.db <- trouble.db %>% arrange(values)
collect(trouble.db) # 1, 3, 5
trouble.in <- tbl(db2, sql("SELECT * from trouble"))
collect(trouble.in) # 5, 3, 1
就地复制的另一种直观语法给出了“表已存在”错误:
trouble.db <- copy_to(db2, as.data.frame(trouble.db), name="trouble", temporary = FALSE)
一种解决方案是手动删除表并重建它,这就是我一直在做的事情:
db2$con %>% db_drop_table(table = "trouble")
trouble <- collect(trouble.db)
trouble.db <- copy_to(db2, trouble, temporary = FALSE)
另一种是放弃替换并创建一系列临时表,我觉得这不美观,但我认为这可能是推荐的范例:
trouble_temp <- data.frame(values = c(5, 1, 3))
trouble_temp.db <- copy_to(db2, trouble_temp, temporary = TRUE)
trouble <- trouble.db %>% arrange(values)
trouble.db <- copy_to(db2, trouble, temporary = FALSE)
我怀疑“删除并重新复制”最终会成为答案,但出于对美丽解决方案的热爱,我想我会问是否有更好的方法。