根据作为因子水平给出的现有间隔Bin新数据

时间:2016-03-04 16:21:36

标签: regex r

我有一个因子级别代表区间(由cut生成):

> head(data.train$glucose)
[1] [0,126]   [0,126]   (126,199] [0,126]   [0,126]   [0,126]  
Levels: [0,126] (126,199]

现在我想从数字向量生成具有相同级别的新因子,以便当相应的数字落入第一个区间(例如24)时,它变为[0,126]并且如果它落入第二个区间(例如153)它变为(126,199]

间隔的数量可以与括号的形式不同(取决于它们是打开还是关闭)。

我想我可以subcut一起使用(就像在cut的帮助文件中的最后一个示例一样)但我不是很擅长它足够。还有另一种更直观的方式吗?但也许我认为太复杂了......

如果您使用sub提供解决方案,请解释表达式。请不要提供其他软件包的功能解决方案,因为我自己开发软件包,我希望尽可能保持精简。

1 个答案:

答案 0 :(得分:1)

我一直在寻找一种优雅的方法来做到这一点,但最终使用正如你所建议的正则表达式:

ints<-cut(1:10,5)
set.seed(345)
a<-runif(20,1,10)

    # get levels
levs <- levels(ints)
# remove brackets
levs.num <- sub(  "^[\\(\\[]{1}(.+)[\\)\\]]{1}$" , "\\1" ,levs , perl = TRUE)
levs.right <- sub(  "^[\\(\\[]{1}.+([\\)\\]]{1})$" , "\\1" ,levs , perl = TRUE)
levs.left <- sub(  "^([\\(\\[]{1}).+[\\)\\]]{1}$" , "\\1" ,levs , perl = TRUE)
# get breaks
breaks <- unique(as.numeric(unlist(strsplit(levs.num ,","))))

if(all(levs.right=="]")){ 
    right.arg <- TRUE
}else if(all(levs.left=="[")){
  right.arg <- FALSE
}else{
      stop("problem")
  }
table(cut(a,breaks , right = right.arg ))

我的正则表达式应该选择[或(和)或之间的所有内容并将其返回