Подсчитать максимальное количество последовательных букв в строке - PullRequest
0 голосов
/ 28 ноября 2018

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

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

Ответы [ 4 ]

0 голосов
/ 04 декабря 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
0 голосов
/ 28 ноября 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 на самом деле просто представляет любой не штриховой символ, поэтому нам не нужно явно проверять его.Если вы do действительно хотите только сосчитать X, тогда мы можем попробовать удалить все не X символы, прежде чем мы посчитаем:

sapply(vector, function(x) {
    max(nchar(gsub("[^X]", "", unlist(strsplit(x, "-+")))))
})
0 голосов
/ 28 ноября 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
0 голосов
/ 28 ноября 2018

В базе 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
...