【问题标题】:RMySQL dbWriteTable adding columns to table (dynamically?)RMySQL dbWriteTable 向表中添加列(动态?)
【发布时间】:2012-08-16 00:22:50
【问题描述】:

我刚开始使用名为 RMySQL 的 R 包来解决我计算机上的一些内存限制。我正在尝试在 R 中获取一个包含 100 列的矩阵(称为 data.df),然后在具有“100 选择 2”(=4950)列的 SQL 数据库上创建一个新表,其中每列是两个的线性组合来自初始矩阵的列。到目前为止,我有这样的事情:

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”参数,这是在 RMySQL dbWriteTable with field.types 建议的。遗憾的是,它并没有帮到我太多。

问题:

  1. 即使 R 有 4950 列,创建自己的 sql 数据库是否也是解决 R 的内存受限性质的有效解决方案?
  2. dbWriteTable() 是否适合在这里使用?
  3. 假设前面两个问题的答案都是“是”...为什么这不起作用?

感谢您的帮助。



[编辑]:带有错误输出的代码:

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

我只想将“名称”用作一堆列标签。他们最初是约会。我想成为“温度”的实际数据。

【问题讨论】:

    标签: mysql r


    【解决方案1】:

    有一个 4950 行的查询是可以的,问题是你需要什么列。

    如果你总是“选择 *”,你最终会耗尽你所有的系统内存(在表有 100 列的情况下)

    如果您遇到任何问题,为什么不给我们一些错误信息呢?

    【讨论】:

    • 这是有道理的——按时间索引列。现在我正在尝试从 R 中弄清楚如何做到这一点。当您尝试追加行而不是列时,“追加”可能效果更好。
    猜你喜欢
    • 2012-02-10
    • 1970-01-01
    • 2014-09-07
    • 2011-05-16
    • 2011-09-06
    • 2013-06-10
    • 2014-12-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多