计算字符串中连续字母的最大值

时间:2018-11-28 13:57:11

标签: r regex string string-matching stringr

我有这个向量:

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 :(得分:3)

在基数R中,我们可以将每个keyof typeof obj拆分为单独的字符,然后使用vector找到rle的“ X”连续长度。

max

答案 1 :(得分:2)

这是一种略有不同的方法。我们可以将输入向量中的每一项分割成任意数量的破折号。然后,找到长度最大的子字符串。

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实际上只是代表任何非破折号字符,因此我们不需要显式检查它。如果您确实只想计算X,那么我们可以在计算之前尝试删除所有非X字符:

sapply(vector, function(x) {
    max(nchar(gsub("[^X]", "", unlist(strsplit(x, "-+")))))
})

答案 2 :(得分:1)

在gsubfn中使用strapply来提取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

答案 3 :(得分:1)

这里有两个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