我嘗試做的是將 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.
如何僅按公共列附加表?
提前致謝。
uj5u.com熱心網友回復:
我認為你需要:
- 確定缺少哪些列,
alter table那些新的列出現,然后- 上傳資料,假設第一個中的所有資料在第二個中丟失都是可以為空的。
### 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
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/318536.html
標籤:sql r PostgreSQL
上一篇:第n組標記(僅計算新組的畢業生)
下一篇:為不在我的資料庫中的日期生成圖表
