首页 > 解决方案 > 当 R 中的 PostgreSQL 中的列号不同时如何附加两个数据框

问题描述

我尝试做的是将我的 PostgreSQL 数据库中的行绑定到匹配的列中,例如rbindlist's (from data.table)fill参数。

简而言之,我想在我的数据库中看到的表是这样的;

a <- data.frame(no=c(234,235,346),year=2012:2014,col1=c(1,1,1))
b <- data.frame(no=c(333,353,324),year=2014:2016,col2=c(2,2,2))
union_data_frame <- data.table::rbindlist(list(a,b),fill=T)

union_data_frame

     no  year  col1  col2
1   234  2012     1    NA
2   235  2013     1    NA
3   346  2014     1    NA
4   333  2014    NA     2
5   353  2015    NA     2
6   324  2016    NA     2

RPostgres以这种方式尝试过;

library(RPostgres)

a <- data.frame(no=c(234,235,346),year=2012:2014,col1=c(1,1,1))
b <- data.frame(no=c(333,353,324),year=2014:2016,col2=c(2,2,2))

drv <- dbDriver('Postgres')
con <- dbConnect(drv,user='postgres',dbname='dummy_db')


dbWriteTable(con,'dummy_table',a,append = T,row.names = F)
dbWriteTable(con,'dummy_table',b,append = T,row.names = F)

但它不起作用并且会出现错误,因为第二个表 ( b) 没有名为 的列col2

如何仅通过常见列附加表?

提前致谢。

标签: sqlrpostgresql

解决方案


我认为你需要:

  1. 确定缺少哪些列,
  2. alter table那些新的列存在,然后
  3. 上传数据,假设第二个中缺少的第一个中的所有数据都可以为空。
### pg <- dbConnect(...)
dbWriteTable(pg, "some_table", a)
newcolumns <- setdiff(colnames(b), dbListFields(pg, "a"))
newcolumns
# [1] "col2"
addqry <- paste("alter table some_table",
                paste("add", newcolumns, dbDataType(pg, b[,newcolumns]),
                      collapse = ", "))
addqry
# [1] "alter table some_table add col2 DOUBLE PRECISION"
dbExecute(pg, addqry)
dbWriteTable(pg, "some_table", b, append = TRUE)
dbGetQuery(pg, "select * from some_table")
#    no year col1 col2
# 1 234 2012    1   NA
# 2 235 2013    1   NA
# 3 346 2014    1   NA
# 4 333 2014   NA    2
# 5 353 2015   NA    2
# 6 324 2016   NA    2

推荐阅读