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

标签 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 ... 到 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(我也可以更新它)。

最佳答案

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

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,...。

根据评论进行修订

关于sql - 在 SQLite 中存储矩阵数据以便在 R 中快速检索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21080684/

相关文章:

sql - 独特的季度记录

r - 没有测试的单元测试

R中使用的k-means的结果

r - 按最后一个元素匹配向量

r - 将单行转换为R中的多列

sql - Postgres 查询中的语法错误

python - Django JOIN 将列重命名为查询集

sql - 两个 SELECT 和一个 SELECT 加 JOIN 的性能差异

asp.net - 如何让 MySQL 过程返回 bool 值?

r - R 3.2.3 中的 ggplot2 : layers broken?