gpt4 book ai didi

r - 将列添加到 sqlite 数据库

转载 作者:行者123 更新时间:2023-12-01 00:29:39 25 4
gpt4 key购买 nike

我正在尝试将我在 R 中生成的向量作为新列添加到 sqlite 表中。为此,我想使用 dplyr (我根据这篇文章 here 安装了最新的开发版本以及 dbplyr 包)。我试过的:

library(dplyr)
library(DBI)

#creating initial database and table
dbcon <- dbConnect(RSQLite::SQLite(), "cars.db")
dbWriteTable(dbcon, name = "cars", value = cars)
cars_tbl <- dplyr::tbl(dbcon, "cars")

#new values which I want to add as a new column
new_values <- sample(c("A","B","C"), nrow(cars), replace = TRUE)

#attempt to add new values as column to the table in the database
cars_tbl %>% mutate(new_col = new_values) #not working

实现这一目标的简单方法是什么(不一定使用 dplyr)?

最佳答案

不知道这样做的方法 dyplr ,但您可以使用 RSQLite 来实现直接地。问题实际上不在于 RSQLite ,但事实上我不知道如何将列表传递给 mutate .请注意,在您的代码中,这样的事情会起作用:

cars_tbl %>% mutate(new_col = another_column / 3.14)

无论如何,我的选择。我创造了一个玩具 cars数据框。
cars <- data.frame(year=c(1999, 2007, 2009, 2017), model=c("Ford", "Toyota", "Toyota", "BMW"))

我打开连接并实际创建表,
dbcon <- dbConnect(RSQLite::SQLite(), "cars.db")
dbWriteTable(dbcon, name = "cars", value = cars)

添加新列并检查,
dbGetQuery(dbcon, "ALTER TABLE cars ADD COLUMN new_col TEXT")
dbGetQuery(dbcon, "SELECT * FROM cars")
year model new_col
1 1999 Ford <NA>
2 2007 Toyota <NA>
3 2009 Toyota <NA>
4 2017 BMW <NA>

然后您可以更新新列,但唯一棘手的是您必须提供 where声明,在这种情况下,我使用年份。
new_values <- sample(c("A","B","C"), nrow(cars), replace = TRUE) 
new_values
[1] "C" "B" "B" "B"

dbGetPreparedQuery(dbcon, "UPDATE cars SET new_col = ? where year=?",
bind.data=data.frame(new_col=new_values,
year=cars$year))

dbGetQuery(dbcon, "SELECT * FROM cars")
year model new_col
1 1999 Ford C
2 2007 Toyota B
3 2009 Toyota B
4 2017 BMW B

作为唯一索引,您始终可以使用 rownames(cars) ,但您必须将其添加为数据框中的列,然后添加到表中。

根据@krlmlr 的建议进行编辑: 使用 dbExecute 确实好多了而不是弃用 dbGetPreparedQuery ,
dbExecute(dbcon, "UPDATE cars SET new_col = :new_col where year = :year",
params=data.frame(new_col=new_values,
year=cars$year))

评论后编辑 : 前几天没想过这个,不过就算是 SQLite您可以使用 rowid .我已经测试过这个并且它有效。
dbExecute(dbcon, "UPDATE cars SET new_col = :new_col where rowid = :id",
params=data.frame(new_col=new_values,
id=rownames(cars)))

尽管您必须确保表中的 rowid 与您的 rownames 相同。无论如何,您始终可以像这样获得 rowid:
dbGetQuery(dbcon, "SELECT rowid, * FROM cars")
rowid year model new_col
1 1 1999 Ford C
2 2 2007 Toyota B
3 3 2009 Toyota B
4 4 2017 BMW B

关于r - 将列添加到 sqlite 数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43967965/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com