我有这个向量:
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
答案 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