2014-01-12 3 views
2

У меня есть 48 матриц размеров 1000 строк и 300 000 столбцов, где каждый столбец имеет соответствующий идентификатор, и каждая строка является измерением в один момент времени. Каждая из 48 матриц имеет одинаковую размерность, и их идентификаторы столбцов одинаковы.хранить данные матрицы в SQLite для быстрого извлечения в R

Способ, которым хранятся теперь матрицы, - это объекты RData, а также текстовые файлы. Я думаю, для SQL мне пришлось бы транспонировать и хранить по ID, и в этом случае теперь матрица будет иметь размеры 300 000 строк и 1000 столбцов.

Я думаю, если я транспонировать его небольшую версию данных будет выглядеть следующим образом:

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

Я хочу, чтобы хранить их таким образом, таким образом, что я могу использовать R, чтобы получить несколько строк (От 5 до 100 каждый раз).

Общая стратегия, которую я имею в виду следующее:

(1) Создание базы данных в sqlite3 с помощью R, которые я буду использовать для хранения матрицы (в разных таблицах)

Для файла 1, 48 (каждый файл имеет тусклый 1000 строк и столбцов) 300000:

(2) Считывание файла в R

(3) Сохраните файл в виде матрицы в R

(4) Переместите матрицу (теперь ее размеры 300 000 строк и 1000 столбцов). Каждая строка теперь является уникальным идентификатором в таблице в sqlite.

(5) Самосвал/записать матрицу в базу данных sqlite3, созданной в (1) (дамп в новую таблицу, вероятно?)

шаги 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?

Из учебника было бы выглядеть следующим образом:

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

Но его ID1, ID2, ID30 жестко прописаны в коде и мне нужно динамически получить их. I.e., иногда мне может понадобиться id1, id2, id10, id100; а в другой раз я может понадобиться id80, id90, id250000 и т.д.

Нечто подобное было бы больше approp для моих потребностей:

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

Возможно, вы захотите посмотреть на [PyTables] (http://www.pytables.org/moin). Если вы привыкли работать с SQL, см. Эти [подсказки для пользователей SQL] (http://www.pytables.org/moin/HintsForSQLUsers). – ChrisP

+0

@ChrisP они выглядят потрясающе, хотя мой коллаборационист только что обновил меня, что они нам нужны в R, потому что весь код обработки был выполнен в R ... но большое предложение, я изменил вопрос на R/sql. – Dnaiel

+0

Вы можете работать с HDF5 также из R с пакетом h5r –

ответ

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

ПЕРЕСМОТРЕННЫЙ на основе комментариев.

+0

большое спасибо. Это похоже на путь. Я должен был быть более ясным, хотя каждая строка (в транспонированной матрице) имеет идентификатор, и я хотел бы получить их по идентификатору вместо номера столбца/строки, не могли бы вы изменить пример для такого случая? – Dnaiel

+0

ОК. Добавили идентификаторы строк и столбцов. –

+0

Еще раз спасибо. Я пытаюсь следовать логике: зачем мне хранить ее в виде тройки? Мне нужно только получить определенные строки, а не конкретные столбцы, не достаточно ли просто сохранить их в качестве матрицы и иметь идентификаторы строк? – Dnaiel

Смежные вопросы