From ggrothendieck at gmail.com  Sat Oct 17 16:35:08 2009
From: ggrothendieck at gmail.com (Gabor Grothendieck)
Date: Sat, 17 Oct 2009 10:35:08 -0400
Subject: [Rd] forwarded: bug (?) in cut.POSIXt with "breaks"=integer
In-Reply-To: <4AD75795.9070308@ufl.edu>
References: <4AD75795.9070308@ufl.edu>
Message-ID: <971536df0910170735o47186d18p95678aaf2ba10b03@mail.gmail.com>

That is usually done with trunc rather than cut since in the case of a
time series we normally don't want a factor result (which is what cut
would give):

trunc(tt, "secs")
trunc(tt, "mins")
# etc

trunc.POSIXt does not support the "30 secs" syntax but trunc.times in
the chron package supports similar functionality:

library(chron)
trunc(as.chron(format(tt)), "00:00:30")

# or relative to GMT
trunc(as.chron(tt)), "00:00:30")

On Thu, Oct 15, 2009 at 1:10 PM, Ben Bolker <bolker at ufl.edu> wrote:
>
> From: Vitalie S. <vitosmail <at> rambler.ru>
> Subject: Bug in cut.POSIXt
> Newsgroups: gmane.comp.lang.r.general
> Date: 2009-10-15 15:47:48 GMT (1 hour and 29 minutes ago)
>
> Hello Everyone,
>
> Before reporting decided to post here first:
>
> tt <- structure(c(1254238817, 1254238859, 1254238969, 1254239080), class =
> c("POSIXt",
> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?"POSIXct"),
> tzone = "")
>
> cut.POSIXt(tt, 2)
> #Error in `levels<-.factor`(`*tmp*`, value = character(0)) :
> # ?number of levels differs
>
> cut.POSIXt(tt, 2, labels=c("a1", "a2"))
> #[1] a1 a1 a2 a2
> #Levels: a1 a2
>
> cut(tt, "2 mins")
> #[1] 2009-09-29 17:40:00 2009-09-29 17:40:00 2009-09-29 17:42:00
> 2009-09-29 17:44:00
> #Levels: 2009-09-29 17:40:00 2009-09-29 17:42:00 2009-09-29 17:44:00
>
>> sessionInfo()
> R version 2.9.2 Patched (2009-09-24 r50069)
> i386-pc-mingw32
>
> locale:
> LC_COLLATE=English_United States.1252;LC_CTYPE=English_United
> States.1252;LC_MONETARY=English_United
> States.1252;LC_NUMERIC=C;LC_TIME=English_United States.1252
>
> attached base packages:
> [1] stats ? ? graphics ?utils ? ? datasets ?grDevices methods ? base
>>
>
> Vitalie.
>
>
> ======================
>
> ?I would agree that this is a bug ... this patch gets rid of the error,
> but leaves the labels very ugly -- given enough hours I might be able to
> figure out how to make the labels nice, but someone else can probably do
> it quicker (see comments in code below)
>
>
> ?It would probably also be worth adding something like
>
> cut(Dates,2)
>
> ?around line 5067 of reg-tests-1.R
>
>
> --- datetime.R ?2009-10-15 13:01:15.000000000 -0400
> ***************
> *** 764,770 ****
> ? ? ? ?}
> ? ? ?} else stop("invalid specification of 'breaks'")
> ? ? ?res <- cut(unclass(x), unclass(breaks), labels = labels, right =
> right, ...)
> ! ? ? if(is.null(labels)) levels(res) <-
> as.character(breaks[-length(breaks)])
> ? ? ?res
> ?}
>
> --- 764,782 ----
> ? ? ? ?}
> ? ? ?} else stop("invalid specification of 'breaks'")
> ? ? ?res <- cut(unclass(x), unclass(breaks), labels = labels, right =
> right, ...)
> ! ? ? if(is.null(labels)) {
> ! ? ? ? if (is.numeric(breaks) && length(breaks) == 1L)
> ! ? ? ? ? levels(res) <- as.character(breaks[-length(breaks)])
> ! ? ? ? } else {
> ! ? ? ? ? ## ?? what should happen here?
> ! ? ? ? ? ## this version simply leaves the break values
> ! ? ? ? ? ## as numeric (and very ugly)
> ! ? ? ? ? ## I don't know how to safely convert the breakpoints
> ! ? ? ? ? ## back to a character format (e.g.
> ! ? ? ? ? ## levels(res) = [1970-01-01 00:00:00,1970-01-01 12:00:00)
> ! ? ? ? ? ## instead of [18000,61200)
> ! ? ? ? }
> ! ? ? }
> ? ? ?res
> ?}
>
>
> --
> Ben Bolker
> Associate professor, Biology Dep't, Univ. of Florida
> bolker at ufl.edu / www.zoology.ufl.edu/bolker
> GPG key: www.zoology.ufl.edu/bolker/benbolker-publickey.asc
>
>
> ______________________________________________
> R-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
>
>



[Rd] forwarded: bug (?) in cut.POSIXt with "breaks"=integer
Gabor Grothendieck