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

У меня в настоящее время есть строка в R, которая выглядит следующим образом:

df <- c ("BMMBMMBMMMMMBMMBM")

Мне нужно определить, сколько раз ММ появляются в этой строке (в данном примере это 4).

Я использовал str_count(df, "MM"), но это только подсчитывает, сколько раз два M находятся рядом друг с другом в строке (что возвращает 5).

Любая помощь будет отличной ...

Спасибо!

Ответы [ 4 ]

0 голосов
/ 11 июня 2018

Базовое решение:

s <- "BMMBMMBMMMMMBMMBM"
lengths(gregexpr("MM+", s))
## [1] 4

Обратите внимание, что ввод, названный df в вопросе, представляет собой строку символов, а не фрейм данных, и c("X") идентичен "X", поэтому c и скобки не нужны.

0 голосов
/ 11 июня 2018

Попробуйте следующий шаблон:

str_count(df,"(M)\\1+")

Это будет считать два или более М как один случай.Или

str_count(df,"M{2,}")
0 голосов
/ 11 июня 2018

Вот базовый подход R без регулярных выражений:

with(rle(unlist(strsplit(x, ""))), sum(values == "M" & lengths >= 2))
# [1] 4
0 голосов
/ 11 июня 2018

Возможный подход:

stringr::str_count(df, "MM+")
#output
[1] 4

+ означает один или несколько

в базе R:

lengths(gregexpr("MM+", df))

gregexpr возвращает список,каждый элемент соответствует одному элементу df.lengths возвращает длину каждого элемента списка.

РЕДАКТИРОВАТЬ: согласно комментарию @docendo discimus второй параметр немного опасен, так как он вернет 1, если строка не была найдена.

lengths(gregexpr("xyz+", df))
#output
1

Более безопасный вариант:

lapply(gregexpr("MM+", df), function(x) length(x[x > 0]))
#output
[[1]]
[1] 4

lapply(gregexpr("xyz+", df), function(x) length(x[x > 0]))
#output
[[1]]
[1] 0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...