2017-01-23 9 views
4

Я использую таблицу данных в R для хранения временных рядов. Я хочу вернуть подмножество таким образом, чтобы последовательные строки для выбранных времен составляли не менее N секунд от последней выбранной строки, например. если у меня естьВременные ряды подмножества, чтобы выбранные ряды отличались на определенное минимальное время

library(data.table) 
x <- data.table(t=c(0,1,3,4,5,6,7,10,16,17,18,20,21), v=1:13) 
x 
    t v 
1: 0 1 
2: 1 2 
3: 3 3 
4: 4 4 
5: 5 5 
6: 6 6 
7: 7 7 
8: 10 8 
9: 16 9 
10: 17 10 
11: 18 11 
12: 20 12 
13: 21 13 

и я хочу попробовать строк, которые по крайней мере, 5 секунд друг от друга, начиная с первой строки, то я должен получить data.table с парами время/значение:

y <- x[...something...] 
y 
    t v 
1: 0 1 
2: 5 5 
3: 10 8 
4: 16 9 
5: 21 13 

Образцы времени также не должны быть на регулярной основе, поэтому я не могу просто взять каждый M строк. Конечно, я мог бы сделать это, перейдя по строкам data.table вручную, но мне интересно, есть ли более удобный способ выразить это с помощью индексации data.tables.

ответ

4

Вот несколько способов использования прокатку присоединяется найти множество строк, w в вашей подгруппе:

t_plus = 5 

# one join per row visited 
w <- c() 
nxt <- 1L 
while(!is.na(nxt)){ 
    w <- c(w, nxt) 
    nxt <- x[.(t[nxt]+t_plus), on=.(t), roll=-Inf, which=TRUE] 
} 

# join once on all rows 
w0 <- x[.(t+5), on=.(t), roll=-Inf, which=TRUE] 

w <- c() 
nxt <- 1L 
while (!is.na(nxt)){ 
    w <- c(w, nxt) 
    nxt <- w0[nxt] 
} 

Тогда вы можете подмножество как x[w].


Комментарии

В принципе, могут быть и другие подмножества, которые удовлетворяют условию Ор в «по крайней мере 5 секунд друг от друга»; это просто тот, который найден путем повторения с первой строки вперед.

Второй способ основан на @DavidArenburg's answer на Q & Генрих, указанный выше. Хотя вопрос кажется таким же, я не мог получить такой подход, чтобы работать здесь полностью.

Как правило, это плохая идея выращивать вещи в цикле в R (как я делаю с w здесь). Если вы столкнулись с проблемами производительности, это может быть хорошей областью для улучшения этого кода.

+0

Кажется, что 'findInterval' также должен работать здесь, но я не могу этого понять. – Frank

+0

Yikes, я считаю, что ответ «нет», для этого нет удобной парадигмы индексирования. Я, вероятно, просто передам его на Rcpp, если моя реализация R станет узким местом. Спасибо за помощь. – Anthony

+0

@ Энтони Да, я думаю, вы правы в том, что там не было удобного способа, но я также думаю, что вы недооцениваете сложность правила «Максимальный набор строк, которые находятся всего на расстоянии не менее пяти секунд». Если вы не заботитесь о части «максимального набора», тогда она становится намного проще и не требуется вычислять итеративно: 'x [x [. (T = seq (t [1L], t [.N ], by = 5 * 2)), on =. (t), roll = TRUE, что = TRUE, mult = "first"]] 'Выберите до одного числа с каждого 10-секундного интервала et voila - ваше состояние выполняется. В любом случае, если вы найдете хороший способ Rcpp, возможно, вы можете опубликовать его в качестве ответа, чтобы мы могли его увидеть. – Frank