将列添加到sqlite数据库

亚历克斯

我试图将我在R中生成的向量添加到sqlite表中作为新列。为此,我想使用dplyrdbplyr根据此处的这篇文章,我安装了最新的dev。版本以及软件包)。我试过的

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)))

尽管您必须确保表中的行ID与您的行名相同。无论如何,您总是可以这样获得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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章