首页 > 解决方案 > 在R中,我怎样才能找到字符串中n个连续数字的出现

问题描述

我有一个具有相当可重复结构的字符向量,我想将其转换为data.frame. 目前,我正在标记列之间的分隔,添加\t. 其中一个字段是一个至少有 5 个字符的数字,所以我想找到它的开始和结束位置,以便在两端添加一个分隔标记。

我的向量类似于这个:

v_char <- c(
  "1 Name that may contain 2 number  1234567890 more content later",
  "2 Other name that doesn't have a number  1234567870 more content later"
)

我想获得这个向量:

out_v_char <- c(
  "1 Name that may contain 2 number  \t1234567890\t more content later",
  "2 Other name that doesn't have a number  \t1234567870\t more content later"
)

我一直无法找到一个正则表达式来标记数字的连续出现,然后找到它们的开始和结束。我已经达到了如下块的位置,但这似乎有点矫枉过正:

digits <- gregexpr("[0-9]", v_char)
f_tmp <- function(v) {
  cumsum(c(1L, diff(v) > 1))
}
blocks <- lapply(digits, f_tmp)
f_tmp2 <- function(v, n = 5L) {
  tb <- table(v)
  first_consecutive <- min(names(tb)[tb > n])
  return(c(start = head(which(
    v == first_consecutive
  ), 1L),
  end = tail(which(
    v == first_consecutive
  ), 1L)))
}
positions <- lapply(blocks, f_tmp2)

标签: rregex

解决方案


我们实际上可以gsub在这里使用一个简单的

gsub("(\\d{5,})", "\t\\1\t", v_char)

此正则表达式匹配并捕获 5 个或更多 ("{5,}") 数字 ("\d") 的序列。然后gsub获取捕获的匹配 ("\1") 并在替换字符串中的值之前在其前后添加制表符。


推荐阅读