在SQLite中存储矩阵数据,以便在R中快速检索

时间:2014-01-12 21:46:30

标签: sql r

我有48个维度为1,000行和300,000列的矩阵,其中每列具有相应的ID,每行是一个时间点的度量。 48个矩阵中的每一个都具有相同的维度,并且它们的列ID都是相同的。

我现在存储矩阵的方式是作为RData对象,也作为文本文件。我想对于SQL我必须通过ID进行转置和存储,在这种情况下,现在矩阵的尺寸为300,000行和1,000列。

我想如果我转置它,一个小版本的数据将如下所示:

id1 1.5 3.4 10 8.6 .... 10 (with 1,000 columns, and 30,0000 rows now)

我希望以一种方式存储它们,以便我可以使用R来检索一些行(每次约5到100行)。

我想到的一般策略如下:

(1)使用R在sqlite3中创建一个数据库,用于存储矩阵(在不同的表中)

对于文件1到48(每个文件是昏暗的1,000行和300,000列):

(2)将文件读入R

(3)将文件存储为R

中的矩阵

(4)转置矩阵(现在它的尺寸为300,000行和1,000列)。现在,每一行都是sqlite表中的唯一ID。

(5)将矩阵转储/写入(1)中创建的sqlite3数据库(可能将其转储到新表中?)

步骤1-5是创建数据库。

接下来,我需要第6步来读入数据库:

(6)将一些行(一次最多100个左右)读入R作为(子)矩阵。

执行步骤1-6的简单示例代码最好。

一些想法:

之前我使用过SQL,但主要是存储每个列都有名称的表格数据,在这种情况下,每列只是数据矩阵的一个点,我想我可以将它命名为col1 ... to col1000 ?还是有更好的技巧?

如果我看一下:http://sandymuspratt.blogspot.com/2012/11/r-and-sqlite-part-1.html他们就会显示这个例子:

 dbSendQuery(conn = db,
       "CREATE TABLE School
       (SchID INTEGER,
        Location TEXT,
        Authority TEXT,
        SchSize TEXT)")

但就我而言,这看起来像是:

 dbSendQuery(conn = db,
       "CREATE TABLE mymatrixdata
       (myid TEXT,
        col1 float,
        col2 float,
.... etc.....
        col1000 float)")

即,我必须手动输入col1到... col1000,听起来不太聪明。这是我大部分被困的地方。一些代码片段可以帮助我。

然后,我需要将文本文件转储到SQLite数据库中?再次,不确定如何从R。

这样做

似乎我可以这样做:

setwd(<directory where to save the database>)
db <- dbConnect(SQLite(), dbname="myDBname")
mymatrix.df = read.table(<full name to my text file containing one of the matrices>)
mymatrix = as.matrix(mymatrix.df)

现在我需要知道如何将其转储到数据库中......

最后,

如何使用R快速检索某些行(通过ID)的值(不必每次都读取整个矩阵)?

从教程中看起来像这样:

sqldf("SELECT id1,id2,id30 FROM mymatrixdata", dbname = "Test2.sqlite")

但是id1,id2,id30在代码中是硬编码的,我需要动态获取它们。即,有时我可能想要id1,id2,id10,id100;另一次我可能想要id80,id90,id250000等。

这样的事情会更符合我的需求:

cols.i.want = c("id1","id2","id30")
sqldf("SELECT cols.i.want FROM mymatrixdata", dbname = "Test2.sqlite")

再次,不确定如何继续这里。代码片段也会有所帮助。

一个简单的例子可以帮助我很多,不需要编码整个48个文件等等。只是一个简单的例子会很棒!

注意:我使用的是Linux服务器,SQlite 3和R 2.13(我也可以更新它)。

1 个答案:

答案 0 :(得分:2)

在评论中,海报解释说只需要检索特定的行,而不是列:

library(RSQLite)

m <- matrix(1:24, 6, dimnames = list(LETTERS[1:6], NULL)) # test matrix

con <- dbConnect(SQLite()) # could add dbname= arg.  Here use in-memory so not needed.
dbWriteTable(con, "m", as.data.frame(m)) # write
dbGetQuery(con, "create unique index mi on m(row_names)")

# retrieve submatrix back as m2
m2.df <- dbGetQuery(con, "select * from m where row_names in ('A', 'C') 
            order by row_names")
m2 <- as.matrix(m2.df[-1])
rownames(m2) <- m2.df$row_names

请注意,关系数据库是基于设置的,并且不保证存储行的顺序。我们使用order by row_names来获取特定订单。如果这还不够好,那么添加一个给出行索引的列:1,2,3,....

根据评论

修改

相关问题