#r
#r
Вопрос:
Я работаю с потоком данных временных рядов из эксперимента. Мы записываем несколько каналов данных, включая триггерный канал (‘X7.ramptrig’ в связанных данных: пример данных временных рядов), который указывает, когда происходит соответствующее событие в других каналах.
Я пытаюсь создать подмножества следующих n строк (например, 15 000) временного ряда (временные шаги составляют 0,1 мс), которые происходят после запуска триггера (‘1’). В этом столбце есть несколько триггеров (‘1’), расположенных с нерегулярными интервалами. Каждый второй временной шаг равен ‘0’, что указывает на отсутствие нового события.
Я прошу посмотреть, существует ли более эффективное решение для прямого подмножества последующих n строк после обнаружения триггера вместо косвенного (возможно, негибкого) решения, которое я придумал.
Ссылка на простой пример данных: https://gtvault-my.sharepoint.com/:t:/g/personal/shousley6_gatech_edu/EZZSVk6pPpJPvE0fXq1W2KkBhib1VDoV_X5B0CoSerdjFQ?e=izlkml
У меня есть рабочее решение, которое создает индекс из триггерного канала и разбивает набор данных по этому индексу. Поскольку триггеры имеют изменчивое размещение во времени, последующие подмножества фреймов данных не согласованы, и иногда встречаются «дополнительные» подмножества, которые предшествуют «важным» (‘res $ 0’ в примере). Кроме того, мне нужно, чтобы подмножества были сопоставлены по общему времени и выровнены для начала запуска.
Мое текущее решение «сокращает» списки фреймов данных до одинакового размера (в примере до первых 15 000 строк). Хотя это технически работает, это кажется неуклюжим. Я также пытался перевести решение SQL с помощью FETCH NEXT, но эти функции недоступны в SQLite, поддерживаемом в R.
Я полностью открыт для альтернатив, поэтому, пожалуйста, не ограничивайтесь моим текущим решением.
##create index to detect whenever an event trigger occurs
idx<-c(0, cumsum(diff(Time_Series_Data_Example$X7.ramptrig) >0))
## split the original dataframe on event triggers
split1<-split(Time_Series_Data_Example, idx)
## cuts DFs down to 1.5s
res <- lapply(split1, function(x){
x <- top_n(x, -15000)
})
Вот пример вывода данных: ‘head(res[[«1»]]’ 2
Для приведенных в примере данных и кода на выходе получается 4 подмножества, 3 из которых «важны» и синхронизированы по времени с триггером. Первое ‘res $ 0’ — это выбрасываемое подмножество.
Заранее спасибо и, пожалуйста, дайте мне знать, как я могу улучшить свой вопрос (это моя первая попытка).
Комментарии:
1. Можно показать небольшой пример желаемого результата?
2. Привет, Эндрю, я отредактировал исходный пост, чтобы включить краткий пример вывода.
3. Произойдет ли что-то важное в пакетах по 1,5 секунды или они просто удобного размера? Возможно, вам нужен Postgresql, а не SQLite, и, вероятно, пакет r tsmp и все документы из Калифорнийского университета в Риверсайде будут интересны как для автономного анализа, так и для анализа в реальном времени, что может избавить от необходимости создавать фреймы данных одинакового размера.
4. Хорошо, похоже, что подмножества 2-4 желательны? Что 1-го нет — так что в основном сделайте так, чтобы подмножество 1 никогда не появлялось, а желаемый результат состоял только из подмножеств 2-4? Похоже, вы заканчиваете с вашей собственной версией — или как вы можете увидеть улучшение отсюда?
5. Крис — спасибо, что взглянул и дал мне некоторую обратную связь. Я изучу работу Кеога. Да, в этих экспериментах 1,5-секундные пакеты определяют важные события, потому что мы их навязываем. Мы отходим от этих стереотипных событий, поэтому я беспокоюсь о его негибкости. Надеюсь, работа Кеога послужит источником вдохновения.