2016-10-24 2 views
0

Я создал функцию, которая по существу создает вектор двоичных значений 1000. Я смог подсчитать самую длинную полосу последовательных 1s, используя rle.Как найти строку в векторе в r?

Мне было интересно, как найти конкретный вектор (скажем c(1,0,0,1)) в этом большем векторном размере? Я хотел бы, чтобы он возвращал количество вхождений этого вектора. Так c(1,0,0,1,1,0,0,1) должен возвращать 2, в то время как c(1,0,0,0,1) должен возвращать 0.

Большинство решений, которые я нашел только найти, происходит ли последовательность вообще и возвращать TRUE или FALSE, или они дают результаты для отдельных значений, а не конкретный вектор, .

Вот мой код до сих пор:

# creates a function where a 1000 people choose either up or down. 
updown <- function(){ 
    n = 1000 
    X = rep(0,n) 
    Y = rbinom(n, 1, 1/2) 
    X[Y == 1] = "up" 
    X[Y == 0] = "down" 

    #calculate the length of the longest streak of ups: 
    Y1 <- rle(Y) 
    streaks <- Y1$lengths[Y1$values == c(1)] 
    max(streaks, na.rm=TRUE) 
} 

# repeat this process n times to find the average outcome. 
longeststring <- replicate(1000, updown()) 
longeststring(p_vals) 

ответ

1

С Y всего 0 s и 1 s, мы можем paste его в строку и использовать регулярное выражение, в частности, gregexpr. Упрощенный бит:

set.seed(47) # for reproducibility 

Y <- rbinom(1000, 1, 1/2) 

count_pattern <- function(pattern, x){ 
    sum(gregexpr(paste(pattern, collapse = ''), 
       paste(x, collapse = ''))[[1]] > 0) 
} 

count_pattern(c(1, 0, 0, 1), Y) 
## [1] 59 

paste уменьшает образец и Y вплоть до строк, например, "1001" для рисунка здесь и 1000-символьная строка для Y. gregexpr ищет все вхождения шаблона в Y и возвращает индексы совпадений (вместе с немного дополнительной информацией, чтобы их можно было извлечь, если нужно). Потому что gregexpr вернет -1 для соответствия, тестирование чисел, превышающих 0, позволит просто суммировать значения TRUE, чтобы получить количество маг; в данном случае 59.

В других случаях выборочные упоминалось:

count_pattern(c(1,0,0,1), c(1,0,0,1,1,0,0,1)) 
## [1] 2 

count_pattern(c(1,0,0,1), c(1,0,0,0,1)) 
## [1] 0 
2

Это также будет работать:

library(stringr) 
x <- c(1,0,0,1) 
y <- c(1,0,0,1,1,0,0,1) 
length(unlist(str_match_all(paste(y, collapse=''), '1001'))) 
[1] 2 
y <- c(1,0,0,0,1) 
length(unlist(str_match_all(paste(y, collapse=''), '1001'))) 
[1] 0 

Если вы хотите, чтобы соответствовать перекрывающиеся шаблоны,

y <- c(1,0,0,1,0,0,1) # overlapped 
length(unlist(gregexpr("(?=1001)",paste(y, collapse=''),perl=TRUE))) 
[1] 2 
+0

@ Фэн Тянь, на самом деле нам нужно использовать прогнозные утверждения, обновлять код, сообщать мне, если он не работает. –

+0

Я понял. Ты прав. –

Смежные вопросы