计算 R 中向量中模式的所有匹配项
Counting all the matchings of a pattern in a vector in R
我有一个布尔向量,我想在其中计算某些模式出现的次数。
例如,对于模式 "(1,1)"
和向量 "(1,1,1,0,1,1,1)"
,答案应该是 4。
我发现唯一有帮助的内置函数是 grepRaw
,它可以在较长的字符串中查找特定字符串的出现次数。但是,当匹配模式的子字符串重叠时,它似乎失败了:
length(grepRaw("11","1110111",all=TRUE))
# [1] 2
在这种情况下,您有什么想法可以得到正确答案吗?
编辑 1
恐怕 Rich 的回答适用于我发布的特定示例,但在更一般的设置中失败了:
> sum(duplicated(rbind(c(FALSE,FALSE),embed(c(TRUE,TRUE,TRUE,FALSE,TRUE,TRUE,TRUE),2))))
[1] 3
在另一个示例中,预期答案为 0。
使用函数 rollapply
您可以应用 window 的 width = 2
求和值。然后你可以对结果等于 2 的记录求和,即 sum(c(1,1))
library(zoo)
z <- c(1,1,1,0,1,1,1)
sum(rollapply(z, 2, sum) == 2)
我有一个布尔向量,我想在其中计算某些模式出现的次数。
例如,对于模式 "(1,1)"
和向量 "(1,1,1,0,1,1,1)"
,答案应该是 4。
我发现唯一有帮助的内置函数是 grepRaw
,它可以在较长的字符串中查找特定字符串的出现次数。但是,当匹配模式的子字符串重叠时,它似乎失败了:
length(grepRaw("11","1110111",all=TRUE))
# [1] 2
在这种情况下,您有什么想法可以得到正确答案吗?
编辑 1
恐怕 Rich 的回答适用于我发布的特定示例,但在更一般的设置中失败了:
> sum(duplicated(rbind(c(FALSE,FALSE),embed(c(TRUE,TRUE,TRUE,FALSE,TRUE,TRUE,TRUE),2))))
[1] 3
在另一个示例中,预期答案为 0。
使用函数 rollapply
您可以应用 window 的 width = 2
求和值。然后你可以对结果等于 2 的记录求和,即 sum(c(1,1))
library(zoo)
z <- c(1,1,1,0,1,1,1)
sum(rollapply(z, 2, sum) == 2)