在字符串中计算连续字母的最大数量

5

我有这个向量:

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

3
也可以使用sapply(gregexpr("X+", vector), function(x) max(attr(x, "match.length")))函数。 - David Arenburg
4个回答

4
在基本R中,我们可以将每个向量拆分为单独的字符,然后使用rle函数找到“X”的最大连续长度。
sapply(strsplit(vector, ""), function(x) {
   inds = rle(x)
   max(inds$lengths[inds$values == "X"])
})

#[1] 4 1 2 1 2 1 2 1 2 2 3 2

1
如果使用diff处理gregexpr函数的结果(需要一些小心谨慎),你可以不拆分字符串就完成同样的操作:sapply(vector, function(x) {inds=rle(diff(gregexpr("X", x)[[1]])); max(max(inds$lengths[inds$values==1]), 0)+1}) - Cath

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, "-+")))))
})

不使用 unlist 函数: sapply(strsplit(vector, "-+"), function(x) max(nchar(x))) - Scarabee

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接