我有一个字符串,需要计算给定值的出现次数,这些值必须显示为结果 . 我试图从stringr包中获取帮助,但每次找到值/模式时它都会计数 . 例如,假设我们必须在字符串“2132132132137889213”中计算“213”的外观,那么我需要的输出是4但是,在使用stringr_count函数后我得到5 . 请帮忙 .
我不确定我的“正则表达式”技能,但是,希望你可以用这个来做点什么:
max_rep_pat = function(pat, text) { res = gregexpr(paste0("(", pat, ")+"), text) sapply(res, function(x) max(attr(x, "match.length")) / nchar(pat)) } max_rep_pat("213", c("2132132132137889213", "21321321321378892132132132132132213213")) #[1] 4 5
gregexpr 返回发生模式的位置和找到的模式的字符数 . 在"(pattern)+"中包装模式意味着'find the repetitive pattern' . 比较以下两个:
gregexpr
gregexpr("213", "2132132132137889213") [[1]] [1] 1 4 7 10 17 attr(,"match.length") [1] 3 3 3 3 3 #attr(,"useBytes") #[1] TRUE gregexpr("(213)+", "2132132132137889213") [[1]] [1] 1 17 attr(,"match.length") [1] 12 3 #attr(,"useBytes") #[1] TRUE
在第一种情况下,它发现每个"213"的位置和每个匹配的长度只是模式的 nchar . 在第二种情况下,它发现"213"的每一个重复模式,我们看到重复"213"发生了两次;第一次以12/3 = 4次重复,第二次以3/3 = 1次重复 . 使用 max(attr(x, "match.length")) / nchar(pattern) ,我们得到了4 .
nchar
max(attr(x, "match.length")) / nchar(pattern)
另一种方式是:
fun1 <- function(pat, text) { max_rep_pat1 <- function(pat, text) { text1 <- gsub(pat, paste(" ", pat, " "), text) rl <- rle(scan(text = text1, what = "", quiet = T) == pat) max(rl$lengths[rl$values]) } setNames(mapply(max_rep_pat1, pat, text), NULL) } str1 <- c("2132132132137889213", "21321321321378892132132132132132213213") str2 <- "213421342134213477" fun1("2134", str2) #[1] 4 fun1("213", str1) #[1] 4 5
2 回答
我不确定我的“正则表达式”技能,但是,希望你可以用这个来做点什么:
gregexpr
返回发生模式的位置和找到的模式的字符数 . 在"(pattern)+"中包装模式意味着'find the repetitive pattern' . 比较以下两个:在第一种情况下,它发现每个"213"的位置和每个匹配的长度只是模式的
nchar
. 在第二种情况下,它发现"213"的每一个重复模式,我们看到重复"213"发生了两次;第一次以12/3 = 4次重复,第二次以3/3 = 1次重复 . 使用max(attr(x, "match.length")) / nchar(pattern)
,我们得到了4 .另一种方式是: