我有一个因子级别代表区间(由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]
。
间隔的数量可以与括号的形式不同(取决于它们是打开还是关闭)。
我想我可以sub
与cut
一起使用(就像在cut
的帮助文件中的最后一个示例一样)但我不是很擅长它足够。还有另一种更直观的方式吗?但也许我认为太复杂了......
如果您使用sub
提供解决方案,请解释表达式。请不要提供其他软件包的功能解决方案,因为我自己开发软件包,我希望尽可能保持精简。
答案 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 ))
我的正则表达式应该选择[或(和)或之间的所有内容并将其返回