从您的代码开始:
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