Do у вас есть еще несколько данных (или вы можете узнать больше о данных, которые вы знаете из результатов), чтобы узнать, являются ли эти/эти обобщения?
Два подобного подход:
library(stringr)
df <- data.frame(time = rep(1:14), status = c(0,1,1,0,0,0,-1,0,1,0,0,0,-1,0))
dfr <- rle(df$status)
# first approach
find_seq_str <- function() {
str_locate_all(paste(gsub("-1", "x", dfr$values), collapse=""), "10")[[1]][,2]
}
df[as.vector(sapply(find_seq_str(),
function(n) {
i <- sum(dfr$lengths[1:(n-1)])
tail(i:(i+dfr$lengths[n]), -1)
})),]
# second approach
find_seq_ts <- function() {
which(apply(embed(dfr$values, 2), 1, function(x) all(x == c(0, 1))))
}
df[as.vector(sapply(find_seq_ts(),
function(n) {
i <- sum(dfr$lengths[1:(n)])+1
head(i:(i+dfr$lengths[n+1]), -1)
})),]
Оба подхода нуждается в длину перспективы кодировании status
вектора.
Первый делает один символ замену для -1
поэтому мы можем сделать однозначную, прилегающая строку затем использовать str_locate
, чтобы найти пары, которые говорят нам, когда целевая последовательность начинается тогда перестраивает диапазоны нулей от длины RLE.
Если это должно быть база R, я могу попытаться взломать что-то с помощью regexpr
.
Вторая строит парную матрицу и сравнивает ее с той же целевой последовательностью.
Предостережения:
- Я не сделал никакого сравнительного анализа
- Оба создают потенциально большие вещи, если
status
большой.
- Я не полностью уверен, что он обобщает (отсюда и мой начальный q).
- Дэвид является гораздо более удобным для чтения, ремонтопригодны & передаваемом код, но вы получите, чтобы иметь дело со всеми «благости», который приходит с использованием
data.table
;-)
Я завернул подходы в функциях, поскольку они потенциально могут быть затем параметризуется, но вы можете просто просто присвоить значение переменной или вставить ее в sapply
(тьфу, тo).
Сигнал пуска определяется, когда состояние изменяется от 1 до 0, а конечный сигнал имеет значение от 0 до -1. Итак, в этом примере я хотел бы получить все строки от 4 до 6 и от 10 до 12. – amyotun