2016-03-04 59 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

我對所有箱子關閉或關閉的情況做了一些修改。混合案件將更難以解釋。 –