2013-07-16 13 views
1

我試圖使用Hmisc package中的cut2()函數根據時間段創建一個因子。Hmisc - cut2 - 創建時間因素

下面是一些代碼:

library(Hmisc) 

i.time <- as.POSIXct("2013-07-16 13:55:14 CEST") 
f.time <- i.time+as.difftime(1, units="hours") 

data.points <- seq(from=i.time, to=f.time, by="1 sec") 
cut.points <- seq(from=i.time, to=f.time, by="60 sec") 



intervals <- cut2(x=data.points, cuts=cut.points, minmax=TRUE) 

我預期要創建的時間間隔,使得在每個data.point點置於的時間間隔。 但也有一些NA值到底:

> tail(intervals, 1) 
[1] <NA> 
60 Levels: [2013-07-16 13:55:14,2013-07-16 13:56:14) ... [2013-07-16 14:54:14,2013-07-16 14:55:14] 

我期待的選項minmax=TRUE將確保削減興田中包含data.points所有的值。

任何人都可以澄清這裏發生了什麼?如何使用cut2函數生成一個包含數據中所有值的因子?

回答

5

我用cut2優先於cut的原因是,其默認爲「右」是我期望它的工作(左閉區間)的方式。看看代碼,我發現當參數列表中出現'cuts'時,cut函數與一組移動的剪輯一起使用,其效果是使間隔左閉合,然後代碼將因子重新映射爲將"("的更改爲[",但不會使用include.lowest = TRUE。這具有將最後一個值變成<NA>的效果。老實說,我認爲這是一個錯誤。仔細觀察後,我發現cut2的幫助頁面不承諾處理Datedate-time對象,所以「錯誤」太強。它完全無法使用Date對象,它似乎只是一個與POSIXct對象幾乎正確的事故。 (這個實現對我來說有點令人驚訝,因爲我一直認爲它只是使用了cut(... , right=FALSE, include.lowest=TRUE)。)

您可以改變代碼,我的一個想法是將範圍擴展回原始數據的右端點通過改變這一行:

r <- range(x, na.rm = TRUE) 

這一行:

r <- range(c(x,max(x)+min(diff(x.unique))/2), na.rm = TRUE) 

它不完全的結果,我期望的,因爲你在右端得到一個新的類別,因爲倒數第二區間仍然在右開。

intervals <- cut3(x=data.points, cuts=cut.points, minmax=TRUE) 
> tail(intervals, 1) 
[1] 2013-07-16 14:55:14 
61 Levels: [2013-07-16 13:55:14,2013-07-16 13:56:14) ... 
> tail(intervals, 2) 
[1] [2013-07-16 14:54:14,2013-07-16 14:55:14) 2013-07-16 14:55:14      
61 Levels: [2013-07-16 13:55:14,2013-07-16 13:56:14) ... 

不同的想法給出了更滿意的結果。僅此行更改:​​

y <- cut(x, k2) 

要這樣:

y <- cut(x, k2, include.lowest=TRUE) 

給出預期的左,右閉區間,沒有NA:

tail(intervals, 2) 
[1] [2013-07-16 14:54:14,2013-07-16 14:55:14] [2013-07-16 14:54:14,2013-07-16 14:55:14] 
60 Levels: [2013-07-16 13:55:14,2013-07-16 13:56:14) ... 

注:include.lowest = TRUE右= FALSE,實際上會變成include.highest。而我正在摸索我的頭腦,爲什麼我實際上在這種情況下獲得了理想的行爲,因爲我不需要用'正確的'參數來做些什麼。我向Frank Harrell發送了一條消息,他願意考慮修改代碼來處理其他情況。我正在努力。

爲什麼這是一個問題:標籤爲cut.POSIXtcut.Date不同的cut.numeric(實際上cut.default)結果的標籤。前兩種標籤策略只是重複間隔的開始,而來自cut.numeric的標籤包括「[」和「)」以及間隔的結尾。比較這些輸出:

levels(cut(0+1:100, 3)) 
levels(cut(Sys.time()+1:100, 3)) 
levels(cut(Sys.Date()+1:100, 3)) 
+0

+1!很好深入!只是一個問題'cut2'使用'cut'?所以你在內部使用'cut(x,k2,include.lowest = TRUE)'? – agstudy

+0

'cut2'確實使用'cut',如果您修改它以使用include.lowest = TRUE,則可以擺脫NA返回的日期 - 時間值的問題。但是這並不能解決日期值的問題(因爲它們都會返回NA),我仍然在試圖找出問題。 –

1

??cut2

極大極小: 如果指定的削減,但分(X)<分鐘(切口)或最大(X)> MAX(切口), 增強削減包括最小和最大X

檢查你的論點:

x=data.points 
cuts=cut.points 
r <- range(x, na.rm = TRUE) 
(r[1] < min(cuts) | (r[2] > max(cuts))) 
FALSE ## no need to include mean and max 

所以在這裏設置minmax不要改變結果。但在這裏結果使用cut通過設置include.lowest=TRUE)

res <- cut(x=data.points, breaks=cut.points, include.lowest=TRUE) 
table(is.na(res))