SQL 側または R 側で、より多くの列を持つ既存のテーブルに data.frame を追加する簡単な方法はありますか? 欠落している列には、NA を入力する必要があります。テーブル 1 よりも多くの列を持つテーブル 2 を適切に処理する場合のボーナス ポイントは?
library(RSQLite)
# Create
db <- dbConnect( SQLite(), dbname="~/temp/test.sqlite" )
# Write test
set.seed(1)
n <- 1000
testDat <- data.frame(key=seq(n), x=runif(n),y=runif(n),g1=sample(letters[1:10],n,replace=TRUE),g2=rep(letters[1:10],each=n/10),g3=factor( sample(letters[1:10],n,replace=TRUE) ))
if(dbExistsTable(db,"test")) dbRemoveTable(db,"test")
dbWriteTable( conn = db, name = "test", value = testDat, row.names=FALSE )
testDat2 <- data.frame( key=seq(n+1,n+100), x=runif(100) )
> dbWriteTable( conn = db, name="test", value = testDat2, row.names=FALSE, append=TRUE )
[1] FALSE
Warning message:
In value[[3L]](cond) :
RS-DBI driver: (error in statement: table test has 6 columns but 2 values were supplied)
このためのラッパーも想像できます。アルゴリズムは次のようになります。
- 既存の SQL テーブルから 1 行を読み取ります。
- その読み取りから列名を取得します。
- 含まれていない名前で列名を data.frame に追加します。不足を埋める。
- dbWriteTable は、data.frame が SQL テーブルと同じ列を持つようになりました。
これは、SQLite に変更可能なクラスがあるという事実によって単純化されています。しかし、車輪がすでに存在する場合は、車輪を再発明したくありません。
編集
明確にするためのメモ: これらのデータセットは大きいです。SQL データベースは約 30 GB になり、data.frame (実際にdata.table
は明白な理由により) は約 4 GB になります。したがって、SQL テーブルを R に読み込む必要があるソリューションは、初心者向けではありません。
別のアルゴリズムは、SQL でそれを行うことです。
- R data.frame を一時 SQL テーブルに書き込みます。
- そのテーブルをメイン SQL テーブルに追加する SQL マジック。
- 一時 SQL テーブルを削除します。
- 利益。