计算字符串向量中连续数字的函数

Function to count of consecutive digits in a string vector

我想创建一个函数,该函数采用至少包含 1 个元素并包含数字 2 到 5 的字符串对象,并确定是否存在长度至少为 N 的连续数字,其中 N 是实际数字值。

如果是,return 字符串为真,否则return 字符串为假。

例如:

Input: "555123" 
Output: false

因为5只找到了3次而不是5次

或:

Input: "57333" 
Output: true

因为 3 正好被找到 3 次。

您可以检查 table 中的值是否对应于 names

x <- c('555123', '57333')

f <- \(x) {
  s <- strsplit(x, '')
  lapply(s, \(x) {
    tb <- table(x)
    names(tb) == tb
    }) |> setNames(x)
}

f(x)
# $`555123`
# x
#    1     2     3     5 
# TRUE FALSE FALSE FALSE 
# 
# $`57333`
# x
#    3     5     7 
# TRUE FALSE FALSE 

尝试 rle + strsplit 如果你使用的是 base R

f <- function(s) {
  with(
    rle(unlist(strsplit(s, ""))),
    any(as.numeric(values) <= lengths & lengths > 1)
  )
}

你会看到

> f("555123")
[1] FALSE

> f("57333")
[1] TRUE

聚会迟到了,但也许仍然值得您光顾:

数据:

x <- c("555123", "57333", "21112", "12345", "22144", "44440")

用允许的数字定义向量:

digits <- 2:5

定义具有多个反向引用的交替模式:

patt <- paste0("(", digits, ")\", c(1, digits), "{", digits - 1, "}", collapse = "|")

patt输入str_detect:

library(stringr)
str_detect(x, patt)
[1] FALSE  TRUE FALSE FALSE  TRUE  TRUE

另一种方式是:

my_func <- function(x) {
  
  as.numeric(unlist(strsplit(x, ""))) -> all
  table(all[all %in% 2:5]) -> f 
  any(names(f) == f)
  
}

# Input <- "555123"
# (my_func(Input))
# FALSE

# Input <- "57333" 
# (my_func(Input))
# TRUE