コンピュータのメモリ制限を回避するために、RMySQLというRパッケージを使い始めました。Rに100列の行列(data.dfと呼ばれる)を取得し、SQLデータベース上に「100choose 2」(= 4950)列を持つ新しいテーブルを作成しようとしています。各列は2つの線形結合です。初期行列からの列。これまでのところ、私はこのようなものを持っています:
countnumber <- 1
con <- dbConnect(MySQL(), user = "root", password = "password", dbname = "myDB")
temp <- as.data.frame(data.df[,1] - data.df[,2])
colnames(temp) <- paste(pairs[[countnumber]][1], pairs[[countnumber]][2], sep = "")
dbWriteTable(con, "spreadtable", temp, row.names=T, overwrite = T)
for(i in 1:(n-1)){
for(j in (i+1):n){
if(!((i==1)&&(j==2))){ #this part excludes the first iteration already taken care of
temp <- as.data.frame(data.df[,i] - data.df[,j])
colnames(temp) <- "hola"
dbWriteTable(con, "spreadtable", value = temp, append = TRUE, overwrite = FALSE, row.names = FALSE)
countnumber <- countnumber + 1
}
}
}
また、RMySQL :: dbWriteTable()の "field.types"引数を試してみました。これは、RMySQLdbWriteTableでfield.typesを使用して提案されました。悲しいことに、それは私をあまり助けてくれませんでした。
質問:
- 独自のSQLデータベースを、4950列であっても、Rのメモリにバインドされた性質に対する有効なソリューションにしていますか?
- dbWriteTable()は、ここで使用する適切な関数ですか?
- 前の質問の両方に答えが「はい」であると仮定すると...なぜこれが機能しないのですか?
助けてくれてありがとう。
[編集]:エラー出力のあるコード:
names <- as.data.frame(index)
names <- t(names)
#dim(names) is 1 409
con <- dbConnect(MySQL(), user = "root", password = "password", dbname = "taylordatabase")
dbGetQuery(con, dbBuildTableDefinition(MySQL(), name="spreadtable", obj=names, row.names = F))
#I would prefer these to be double types with 8 decimal spaces instead of text
#dim(temp) is 1 409
temp <- as.data.frame(data.df[,1] - (ratios[countnumber]*data.df[,2]))
temp <- t(temp)
temp <- as.data.frame(temp)
dbWriteTable(con, name = "spreadtable", temp, append = T)
テーブルはデータベースに正常に作成されますが(変数の型は後で変更します)、dbWriteTable()行でエラーが発生します。
Error in mysqlExecStatement(conn, statement, ...) :
RS-DBI driver: (could not run statement: Unknown column 'row_names' in 'field list')
[1] FALSE
Warning message:
In mysqlWriteTable(conn, name, value, ...) : could not load data into table
少し変更すると、別のエラーメッセージが表示されます。
dbWriteTable(con, name = "spreadtable", temp, append = T, row.names = F)
と
Error in mysqlExecStatement(conn, statement, ...) :
RS-DBI driver: (could not run statement: Unknown column 'X2011_01_03' in 'field list')
[1] FALSE
Warning message:
In mysqlWriteTable(conn, name, value, ...) : could not load data into table
「名前」を一連の列ラベルとして使用したいだけです。当初は日付でした。「臨時雇用者」になりたい実際のデータ。