sql - 当 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
。
如何仅通过常见列附加表?
提前致谢。
解决方案
我认为你需要:
- 确定缺少哪些列,
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
推荐阅读
- python-3.x - virtualenv 脚本的家在哪里?
- scala - DStream[Class] Spark Streaming 的 reduceByKey/aggregateByKey 替代方案
- tensorflow - 如何修复“来自'object_detection.protos'的calibration_pb2”错误(Windows)
- sql - 如何添加 WHERE 条件以使用 INNER JOIN 进行编码?
- c# - Unity中游戏的蓝牙控制器输入
- c++ - 如何将一个字符串切割成另一个字符串
- apache - XMLHttpRequest 被 axios.post 上的 CORS 策略阻止
- python - 修复python中的重叠图形
- vue.js - 当属性不是 src 时如何让 Vue CLI 生成的项目替换图像 src
- pandas - 根据标签划分两行值并创建一个新列以填充计算值