Начиная с вашего кода:
set.seed(2)
x <- paste(sample( c('e','l','i','r'), 50, replace=TRUE, prob=c(0.6,0.1, 0.1, 0.2) ),collapse = '')
x
# [1] "ereelleieeeereeileeereieeeeeleeeiieriereleeelrleei"
Мы можем легко повторить это с:
set.seed(2)
xmany <- replicate(5000, paste(sample( c('e','l','i','r'), 50, replace=TRUE, prob=c(0.6,0.1, 0.1, 0.2) ),collapse = ''))
head(xmany)
# [1] "ereelleieeeereeileeereieeeeeleeeiieriereleeelrleei"
#4# ^ ^ ^ ^
# [2] "eerleirlrrrireieeeeeeeeeereieeereeeilereleeeeeeeee"
#1# ^
# [3] "eelieeieeeereeiiieleeeliereereelelereieeeereerreee"
#5# ^ ^ ^ ^ ^
# [4] "eelereieeeilerereleeleeiereerelelreiereeeeleeeeeee"
#6# ^ ^ ^ ^ ^ ^
# [5] "irrleieeeeleirleeeeeeleerilerireieieeeeeieerlleeee"
#2# ^ ^
# [6] "reeereeeerrereirerieiliereleeeelrreleereeerereeeee"
#3# ^ ^ ^
Я добавил текст, чтобы выделить в каждой строке вхождения "el"
.
Если вам нужно количество вхождений "el"
в каждой строке, то (без head
для всего):
ispos <- function(a) a > 0
head( lengths(Filter(ispos, gregexpr("el", xmany))) )
# [1] 4 1 5 6 2 3
Примечание: я создал функцию ispos
, потому что gregexpr
будет возвращать -1, если совпадений не будет, что будет держать возвращаемый вектор длиной 1 или более. Таким образом, удаляя негативные элементы, мы получаем честное возвращение. (Я мог бы использовать regmatches(gregexpr(...),xmany)
, но кажется, что это намного больше работы, чем необходимо для получения количества вхождений.)
Если вам нужна таблица частот для него:
table( lengths(Filter(ispos, gregexpr("el", xmany))) )
# 0 1 2 3 4 5 6 7 8 9
# 9701 891 1145 1241 936 459 178 69 16 1