2016-02-08 3 views
2

Мои данные представляют собой временные ряды с столбцами Date и последовательность значений между 1 и 4. Я пытаюсь найти шаблоны последовательных значений, которые начинаются с 1-3 или 4 -2 и получить дату завершения шаблона (т. Е. Когда в первом сценарии попадает 3, а 2 - во втором).Поиск шаблонов значений в таблице в R

Входные данные следующим образом:

data.frame(Date=seq(as.Date("2010/1/1"), as.Date("2010/1/20"), "day"), 
Value=c(1,2,3,4,3,4,3,4,3,2,1,2,1,2,3,4,3,4,3,2)) 


    Date   Value 
1 2010-01-01  1 
2 2010-01-02  2 
3 2010-01-03  3 
4 2010-01-04  4 
5 2010-01-05  3 
6 2010-01-06  4 
7 2010-01-07  3 
8 2010-01-08  4 
9 2010-01-09  3 
10 2010-01-10  2 
... 

Выходной сигнал Я желаю это, например:

data.frame(Date=as.Date(c("2010/1/3","2010/1/10","2010/1/15","2010/1/20")), 
Value=c("Win","Loss","Win","Loss")) 

Date  Value 
2010-01-03 Win 
2010-01-10 Loss 
2010-01-15 Win 
2010-01-20 Loss 

Где бывшая последовательность (Win) можно отличить от последнего (потери) ,

Большое спасибо!

ответ

1

Вы можете сделать это с помощью сопоставления последовательности. Предполагает, что ваши номера не превышают 9. Основная идея заключается в создании последовательности строк из вашей переменной Value. Затем найдите конечные индексы вашей последовательности «выигрыш» и «потеря» (т. Е. 123 или 432).

library(stringr) 
sequence <- paste(df$Value, collapse = "") 
wins <- str_locate_all(sequence, "123") 
losses <- str_locate_all(sequence, "432") 

dfwin <- df[wins[[1]][,2],] 
dfwin$Value <- "Win" 

dfloss <-df[losses[[1]][,2],] 
dfloss$Value <- "Loss" 

rbind(dfwin,dfloss) 

     Date Value 
3 2010-01-03 Win 
15 2010-01-15 Win 
10 2010-01-10 Loss 
20 2010-01-20 Loss 
1

Несколько способов сделать это, очевидно, вот один:

#' @param d a vector of dates 
#' @param v a vector of numeric values 
win_lose <- function(d,v) { 
    l <- list() 
    for (i in 3:length(v)) { 
    if (v[i] == 3 & v[i-1] == 2 & v[i-2] == 1) { 
     l[[length(l)+1]] <- data.frame(Date= d[i], Value= "Win") 
    } else if (v[i] == 2 & v[i-1] == 3 & v[i-2] == 4) { 
     l[[length(l)+1]] <- data.frame(Date= d[i], Value= "Loss") 
    } 
    } 
    return(data.frame(do.call("rbind", l))) 
} 

R> win_lose(df$Date, df$Value) 
     Date Value 
1 2010-01-03 Win 
2 2010-01-10 Loss 
3 2010-01-15 Win 
4 2010-01-20 Loss 
Смежные вопросы