Я пишу пакет для анализа высокопроизводительных данных о поведении животных в R
.
Данные представляют собой многомерные временные ряды.
Я решил представить их с помощью data.tables
, который мне очень удобен.
Для одного животного у меня было бы что-то вроде этого:
one_animal_dt <- data.table(t=1:20, x=rnorm(20), y=rnorm(20))
Однако мои пользователи и я работаем со многими животными, имеющими разные произвольные методы лечения, условия и другие переменные, которые постоянны в каждом животном.
В конце концов, наиболее удобным способом, который я нашел для представления данных, было слияние поведения всех животных и всех экспериментов в одной таблице данных, а также использование дополнительных столбцов, которые я установил как ключ, для каждой из этих "повторяющихся переменных".
Итак, концептуально, что-то вроде этого:
animal_list <- list()
animal_list[[1]] <- data.table(t=1:20, x=rnorm(20), y=rnorm(20),
treatment="A", date="2017-02-21 20:00:00",
animal_id=1)
animal_list[[2]] <- data.table(t=1:20, x=rnorm(20), y=rnorm(20),
treatment="B", date="2017-02-21 22:00:00",
animal_id=2)
# ...
final_dt <- rbindlist(animal_list)
setkeyv(final_dt,c("treatment", "date","animal_id"))
Таким образом, очень удобно вычислять резюме на животное, будучи агностиком относительно всей биологической информации (лечение и т.д.).
На практике у нас есть миллионы (а не 20) последовательных чтений для каждого животного, поэтому столбцы, которые мы добавили для удобства, содержат сильно повторяющиеся значения, которые не являются эффективными с точки зрения памяти.
Есть ли способ сжать этот избыточно избыточный ключ без потери структуры (т.е. столбцов) таблицы? В идеале я не хочу принуждать своих пользователей к использованию самих JOIN.