[英]Hmisc - cut2 - create factors from times
我正在嘗試使用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
將確保hte cuts包括data.points
所有值。
任何人都可以澄清這里發生了什么嗎? 如何使用cut2函數生成一個包含數據中所有值的因子?
我優先使用cut2
進行cut
的原因是,它默認的“ right”是我期望它的工作方式(左封閉間隔)。 查看代碼,我看到當參數列表中出現“ cuts”時, cut
函數與一組偏移的cuts一起使用,其效果是使間隔左向閉合,然后代碼將因子重新標記為將"("
更改為["
,但是不使用include.lowest = TRUE
。這具有將最后一個值轉換為<NA>
。 坦率地說,我將其視為錯誤。我更仔細地看到, cut2
的幫助頁面不能保證處理Date
或date-time
對象,因此“ bug”太強了,對於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,right = FALSE,實際上將變為include.highest
。 而且,當我不需要使用“正確的”參數做某事時,為什么我在這種情況下實際上會得到所需的行為,我也正在摸索。 我向弗蘭克·哈雷爾(Frank Harrell)發送了一條消息,他願意考慮對代碼進行修訂以處理其他情況。 我正在努力。
為什么會出現此問題: cut.POSIXt
和cut.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) )
從??cut2
:
minmax:如果指定了cuts,但min(x)<min(cuts)或max(x)> max(cuts),則增加cuts以包括min和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
不會更改結果。 但是這里通過設置include.lowest=TRUE)
使用cut
的結果:
res <- cut(x=data.points, breaks=cut.points, include.lowest=TRUE)
table(is.na(res))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.