我有 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/