如何扩展给定数字范围以包括所有由短划线分隔的数字

时间:2019-05-20 03:25:03

标签: r

我正在尝试扩展当前以短划线分隔的数字范围,以包括所有数字。

好消息是,我找到了有助于以下配置的代码(不是我的):

“舞厅1-3”产生了“舞厅1,舞厅2,舞厅3”,这是我想要的。问题在于,这要以破折号前后没有空格为条件。当前,“ Ballroom 1-3”返回“ Ballroom 1-3,Ballroom 1-3,Ballroom 1-3”;这不是所需的输出。

请注意,由于多种原因,必须保留破折号前后的空格。 “宴会厅1-3”的输入必须保持不变。

## Dealing with Dash Seperated Sequences of Numbers

expand.dash <- function(dashed) {
  limits <- as.numeric(unlist(strsplit(dashed, '-')))
  seq(limits[1], limits[2])
}


expand.ballrooms <- function(txt) {
   str <- gsub('\\d+-\\d+', '%d', txt)
  dashed_str <- gsub('[a-zA-Z ]+', '', txt)
  sprintf(str, expand.dash(dashed_str))
}

expand.ballrooms("Ballroom 1-3")  
# this works but the line below fails to output the desired result 

expand.ballrooms("Ballroom 1 - 3")
# Result should be identical to the the output returned by the previous line. 

虽然没有错误消息弹出,但破折号前后的空格会导致输出重复。

2 个答案:

答案 0 :(得分:3)

expand.ballrooms中更改

gsub('\\d+-\\d+', '%d', txt)

对此:

gsub('\\d+\\s*-\\s*\\d+', '%d', txt)

答案 1 :(得分:0)

您可以在函数gsub的{​​{1}}中的模式中添加可选的空格

expand.ballrooms

修改后的功能将是

gsub('\\d+\\s?-\\s?\\d+', '%d', txt)

现在这对两种情况都适用

expand.dash <- function(dashed) {
  limits <- as.numeric(unlist(strsplit(dashed, '-')))
  seq(limits[1], limits[2])
}


expand.ballrooms <- function(txt) {
  str <- gsub('\\d+\\s?-\\s?\\d+', '%d', txt)
  dashed_str <- gsub('[a-zA-Z ]+', '', txt)
  sprintf(str, expand.dash(dashed_str))
}