Подсчитать максимальное количество последовательных букв в строке

У меня есть этот вектор:

vector <- c("XXXX-X-X", "---X-X-X", "--X---XX", "--X-X--X", "-X---XX-", "-X--X--X", "X-----XX", "X----X-X", "X---XX--", "XX--X---", "---X-XXX", "--X-XX-X")

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

4, 1, 2, 1,2, 1, 2, 1, 2, 2, 3, 2

person Paula    schedule 28.11.2018    source источник
comment
Можно также sapply(gregexpr("X+", vector), function(x) max(attr(x, "match.length")))   -  person David Arenburg    schedule 28.11.2018


Ответы (4)


В базе R мы можем разделить каждый vector на отдельные символы, а затем, используя rle, найти max последовательную длину для «X».

sapply(strsplit(vector, ""), function(x) {
   inds = rle(x)
   max(inds$lengths[inds$values == "X"])
})

#[1] 4 1 2 1 2 1 2 1 2 2 3 2
person Ronak Shah    schedule 28.11.2018
comment
вы можете сделать то же самое без разделения, если вы работаете с diff над результатом gregexpr (с небольшой предосторожностью ;-)): sapply(vector, function(x) {inds=rle(diff(gregexpr("X", x)[[1]])); max(max(inds$lengths[inds$values==1]), 0)+1}) - person Cath; 28.11.2018

Здесь немного другой подход. Мы можем разбить каждый член входного вектора на любое количество штрихов. Затем найдите подстроку наибольшей длины.

sapply(vector, function(x) {
    max(nchar(unlist(strsplit(x, "-+"))))
})

XXXX-X-X ---X-X-X --X---XX --X-X--X -X---XX- -X--X--X X-----XX X----X-X 
       4        1        2        1        2        1        2        1 
X---XX-- XX--X--- ---X-XXX --X-XX-X 
       2        2        3        2 

Я подозреваю, что X на самом деле просто представляет собой любой символ без тире, поэтому нам не нужно явно проверять его. Если вы действительно действительно хотите подсчитать только X, то мы можем попробовать удалить все символы, отличные от X, перед подсчетом:

sapply(vector, function(x) {
    max(nchar(gsub("[^X]", "", unlist(strsplit(x, "-+")))))
})
person Tim Biegeleisen    schedule 28.11.2018
comment
Без использования unlist: sapply(strsplit(vector, "-+"), function(x) max(nchar(x))) - person Scarabee; 29.11.2018

Используйте strapply в gsubfn, чтобы извлечь подстроки X..., применяя nchar к каждой, чтобы подсчитать количество символов, создавая список векторов длин. sapply функция max каждого такого вектора.

library(gsubfn)

sapply(strapply(vector, "X+", nchar), max)
## [1] 4 1 2 1 2 1 2 1 2 2 3 2
person G. Grothendieck    schedule 28.11.2018

Вот пара tidyverse альтернатив:

map_dbl(vector, ~sum(str_detect(., strrep("X", 1:8))))
# [1] 4 1 2 1 2 1 2 1 2 2 3 2
map_dbl(strsplit(vector,"-"), ~max(nchar(.)))
# [1] 4 1 2 1 2 1 2 1 2 2 3 2
person Moody_Mudskipper    schedule 04.12.2018