我有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(我也可以更新它)。
答案 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,....
修改。