2016-03-04 71 views
2

我有一个因子与表示时间间隔(如由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解决方案,请解释表达式。也请不要提供来自其他软件包的功能的解决方案,因为我正在自己开发一个软件包,我希望尽可能保持精简。

+0

@JasonAizkalns:这看起来比以前想象的更复杂 - 请看我对你的答案的评论。 – vonjd

+0

[this]怎么样?(http://stackoverflow.com/a/19689542) – JasonAizkalns

+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)) 

我的正则表达式应该选择之间的一切[或(和]或),并返回其

+0

谢谢。我认为这个解决方案的问题在于,你失去了关于间隔是打开还是关闭的信息 - 所以结果级别会有所不同,这是一个问题,因为之后会有一些匹配操作。你在代码中看到了这个修复吗? – vonjd

+0

我对所有箱子关闭或关闭的情况做了一些修改。混合案件将更难以解释。 –