【发布时间】:2018-11-20 16:57:45
【问题描述】:
我目前在 R 中有一个如下所示的字符串:
df <- c ("BMMBMMBMMMMMBMMBM")
我需要确定 MM 在这个字符串中出现了多少次(在这个例子中是 4)。
我一直在使用str_count(df, "MM"),但这仅计算字符串中两个 M 相邻的次数(返回 5)。
任何帮助都会很棒...
谢谢!
【问题讨论】:
我目前在 R 中有一个如下所示的字符串:
df <- c ("BMMBMMBMMMMMBMMBM")
我需要确定 MM 在这个字符串中出现了多少次(在这个例子中是 4)。
我一直在使用str_count(df, "MM"),但这仅计算字符串中两个 M 相邻的次数(返回 5)。
任何帮助都会很棒...
谢谢!
【问题讨论】:
这是一个没有正则表达式的基本 R 方法:
with(rle(unlist(strsplit(x, ""))), sum(values == "M" & lengths >= 2))
# [1] 4
【讨论】:
一种可能的方法是:
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
【讨论】:
基础解决方案:
s <- "BMMBMMBMMMMMBMMBM"
lengths(gregexpr("MM+", s))
## [1] 4
请注意,问题中名为df 的输入是字符串,而不是数据框,并且c("X") 与"X" 相同,因此不需要c 和括号。
【讨论】:
lengths(gregexpr("MM+", paste("MM", s)))-1。
尝试以下模式:
str_count(df,"(M)\\1+")
这会将两个或多个 M 计为一个案例。 或者
str_count(df,"M{2,}")
【讨论】: