I have a problem ordering by descending magnitude a POSIXt object. Can someone help please and let me know how to work around this. My goal is to be able to order my data by DATE and then by descending TIME. I have tried to include as much info as possible below. The problem stems from trying to read in times from a CSV file. I have converted the character time values to a POSIXt object using the STRPTIME function. I would like ideally to sort using the order function as below. test.sort <- order(test$DATE, -test$mytime) However, when I try this I receive the error as below : Error in `-.POSIXt`(test2$mytime) : unary '-' is not defined for "POSIXt" objects To make this easier to understand I have pasted my example data below with a list of R commands I have used. Any help or assistance would be appreciated.> test2 <- read.csv("C:/Documents and Settings/Jonathan Cooke/My > Documents/Downloads/test2.csv", sep=",") > test2DATE TIME 1 18/01/2011 08:00:01 2 18/01/2011 08:10:01 3 18/01/2011 08:20:01 4 18/01/2011 08:30:01 5 19/01/2011 08:00:01 6 19/01/2011 08:10:01 7 19/01/2011 08:20:01 8 19/01/2011 08:30:01> test2$mytime <- strptime(test2$TIME,"%H:%M:%S") > test2$mytime[1] "2011-02-14 08:00:01" "2011-02-14 08:10:01" "2011-02-14 08:20:01" "2011-02-14 08:30:01" "2011-02-14 08:00:01" [6] "2011-02-14 08:10:01" "2011-02-14 08:20:01" "2011-02-14 08:30:01"> test2DATE TIME mytime 1 18/01/2011 08:00:01 2011-02-14 08:00:01 2 18/01/2011 08:10:01 2011-02-14 08:10:01 3 18/01/2011 08:20:01 2011-02-14 08:20:01 4 18/01/2011 08:30:01 2011-02-14 08:30:01 5 19/01/2011 08:00:01 2011-02-14 08:00:01 6 19/01/2011 08:10:01 2011-02-14 08:10:01 7 19/01/2011 08:20:01 2011-02-14 08:20:01 8 19/01/2011 08:30:01 2011-02-14 08:30:01> test2.sort <- order(test2$DATE, -test2$mytime)Error in `-.POSIXt`(test2$mytime) : unary '-' is not defined for "POSIXt" objects It's at this stage where I have got stuck as I'm new to R and don't yet know a way of getting around this error. Thanks in advance. JonC -- View this message in context: http://r.789695.n4.nabble.com/how-to-order-POSIXt-objects-tp3304609p3304609.html Sent from the R help mailing list archive at Nabble.com.
----------------------------------------> Date: Mon, 14 Feb 2011 00:55:12 -0800 > From: jon_d_cooke at yahoo.co.uk > To: r-help at r-project.org > Subject: [R] how to order POSIXt objects ? > > > I have a problem ordering by descending magnitude a POSIXt object. Can > someone help please and let me know how to work around this. My goal is to > be able to order my data by DATE and then by descending TIME. > > I have tried to include as much info as possible below. The problem stems > from trying to read in times from a CSV file. I have converted the character > time values to a POSIXt object using the STRPTIME function. I would like > ideally to sort using the order function as below.I have been using the approach I stuck with elsewhere , convert them to numerics and sort that way. Not sure if there is a better way but I'm used to long ints of "time since jan 1 1970 " etc.> > test.sort <- order(test$DATE, -test$mytime) > > However, when I try this I receive the error as below : > > Error in `-.POSIXt`(test2$mytime) : > unary '-' is not defined for "POSIXt" objects > > To make this easier to understand I have pasted my example data below with a > list of R commands I have used. Any help or assistance would be appreciated. > > > test2 <- read.csv("C:/Documents and Settings/Jonathan Cooke/My > > Documents/Downloads/test2.csv", sep=",") > > test2 > DATE TIME > 1 18/01/2011 08:00:01 > 2 18/01/2011 08:10:01 > 3 18/01/2011 08:20:01 > 4 18/01/2011 08:30:01 > 5 19/01/2011 08:00:01 > 6 19/01/2011 08:10:01 > 7 19/01/2011 08:20:01 > 8 19/01/2011 08:30:01 > > > test2$mytime <- strptime(test2$TIME,"%H:%M:%S") > > test2$mytime > [1] "2011-02-14 08:00:01" "2011-02-14 08:10:01" "2011-02-14 08:20:01" > "2011-02-14 08:30:01" "2011-02-14 08:00:01" > [6] "2011-02-14 08:10:01" "2011-02-14 08:20:01" "2011-02-14 08:30:01" > > > test2 > DATE TIME mytime > 1 18/01/2011 08:00:01 2011-02-14 08:00:01 > 2 18/01/2011 08:10:01 2011-02-14 08:10:01 > 3 18/01/2011 08:20:01 2011-02-14 08:20:01 > 4 18/01/2011 08:30:01 2011-02-14 08:30:01 > 5 19/01/2011 08:00:01 2011-02-14 08:00:01 > 6 19/01/2011 08:10:01 2011-02-14 08:10:01 > 7 19/01/2011 08:20:01 2011-02-14 08:20:01 > 8 19/01/2011 08:30:01 2011-02-14 08:30:01 > > > test2.sort <- order(test2$DATE, -test2$mytime) > Error in `-.POSIXt`(test2$mytime) : > unary '-' is not defined for "POSIXt" objects > > It's at this stage where I have got stuck as I'm new to R and don't yet know > a way of getting around this error. Thanks in advance. > > JonC > > > > > > > > > > -- > View this message in context: http://r.789695.n4.nabble.com/how-to-order-POSIXt-objects-tp3304609p3304609.html > Sent from the R help mailing list archive at Nabble.com. > > ______________________________________________ > R-help at r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide http://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code.
'unclass' it first(assuming that it is POSIXct) -unclass(mytime) On Mon, Feb 14, 2011 at 3:55 AM, JonC <jon_d_cooke at yahoo.co.uk> wrote:> > I have a problem ordering by descending magnitude a POSIXt object. Can > someone help please and let me know how to work around this. My goal is to > be able to order my data by DATE and then by descending TIME. > > I have tried to include as much info as possible below. The problem stems > from trying to read in times from a CSV file. I have converted the character > time values to a POSIXt object using the STRPTIME function. I would like > ideally to sort using the order function as below. > > test.sort <- order(test$DATE, -test$mytime) > > However, when I try this I receive the error as below : > > Error in `-.POSIXt`(test2$mytime) : > ?unary '-' is not defined for "POSIXt" objects > > To make this easier to understand I have pasted my example data below with a > list of R commands I have used. Any help or assistance would be appreciated. > >> test2 <- read.csv("C:/Documents and Settings/Jonathan Cooke/My >> Documents/Downloads/test2.csv", sep=",") >> test2 > ? ? ? ?DATE ? ? TIME > 1 18/01/2011 08:00:01 > 2 18/01/2011 08:10:01 > 3 18/01/2011 08:20:01 > 4 18/01/2011 08:30:01 > 5 19/01/2011 08:00:01 > 6 19/01/2011 08:10:01 > 7 19/01/2011 08:20:01 > 8 19/01/2011 08:30:01 > >> test2$mytime <- strptime(test2$TIME,"%H:%M:%S") >> test2$mytime > [1] "2011-02-14 08:00:01" "2011-02-14 08:10:01" "2011-02-14 08:20:01" > "2011-02-14 08:30:01" "2011-02-14 08:00:01" > [6] "2011-02-14 08:10:01" "2011-02-14 08:20:01" "2011-02-14 08:30:01" > >> test2 > ? ? ? ?DATE ? ? TIME ? ? ? ? ? ? ?mytime > 1 18/01/2011 08:00:01 2011-02-14 08:00:01 > 2 18/01/2011 08:10:01 2011-02-14 08:10:01 > 3 18/01/2011 08:20:01 2011-02-14 08:20:01 > 4 18/01/2011 08:30:01 2011-02-14 08:30:01 > 5 19/01/2011 08:00:01 2011-02-14 08:00:01 > 6 19/01/2011 08:10:01 2011-02-14 08:10:01 > 7 19/01/2011 08:20:01 2011-02-14 08:20:01 > 8 19/01/2011 08:30:01 2011-02-14 08:30:01 > >> test2.sort <- order(test2$DATE, -test2$mytime) > Error in `-.POSIXt`(test2$mytime) : > ?unary '-' is not defined for "POSIXt" objects > > It's at this stage where I have got stuck as I'm new to R and don't yet know > a way of getting around this error. Thanks in advance. > > JonC > > > > > > > > > > -- > View this message in context: http://r.789695.n4.nabble.com/how-to-order-POSIXt-objects-tp3304609p3304609.html > Sent from the R help mailing list archive at Nabble.com. > > ______________________________________________ > R-help at r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide http://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code. >-- Jim Holtman Data Munger Guru What is the problem that you are trying to solve?
a) POSIXt represents the idea of a datetime. POSIXct is a compact representation (number of seconds since 1970-01-01 00:00:00 GMT) of this idea. POSIXlt is an inefficient but convenient representation (using nine separate components) of this idea. Either POSIXct or POSIXlt may be treated as a POSIXt, but you cannot create a POSIXt as such... it has to be one of the other two types. Strptime returns a POSIXlt, not so efficient for sorting and so forth. b) Because the POSIXct representation is always referenced to GMT, and the POSIXlt representation always indicates the timezone and daylight savings time, you may find these representations difficult to work with for "simple" problems. If your times come from multiple timezones, or include the daylight savings time shift (and you need to work with times around the autumn changeover) then you have to use POSIXct or POSIXlt. Otherwise, you may find that Date or chron classes are easier to work with. c) Note that a column of data that only includes time should probably be converted to "difftime" using as.difftime. Your code is filling in the current date on your strptime result, which can get you into trouble later if you import other times on other dates and then try to compare times you imported previously. There is an as.numeric(z,units="secs") that you can use to obtain sortable values on the fly. tc <- textConnection( "DATE,TIME 18/01/2011,08:00:01 18/01/2011,08:10:01 18/01/2011,08:20:01 18/01/2011,08:30:01 19/01/2011,08:00:01 19/01/2011,08:10:01 19/01/2011,08:20:01 19/01/2011,08:30:01 ") dta <- read.csv( tc, as.is=TRUE ) close( tc ) dta$DATE <- as.Date( dta$DATE, format="%d/%m/%Y" ) dta$TIME <- as.difftime( dta$TIME ) dta.sorted <- dta[order( dta$DATE, -as.numeric( dta$TIME ) ), ] JonC wrote:> I have a problem ordering by descending magnitude a POSIXt object. Can > someone help please and let me know how to work around this. My goal is to > be able to order my data by DATE and then by descending TIME. > > I have tried to include as much info as possible below. The problem stems > from trying to read in times from a CSV file. I have converted the character > time values to a POSIXt object using the STRPTIME function. I would like > ideally to sort using the order function as below. > > test.sort <- order(test$DATE, -test$mytime) > > However, when I try this I receive the error as below : > > Error in `-.POSIXt`(test2$mytime) : > unary '-' is not defined for "POSIXt" objects > > To make this easier to understand I have pasted my example data below with a > list of R commands I have used. Any help or assistance would be appreciated. > > >> test2 <- read.csv("C:/Documents and Settings/Jonathan Cooke/My >> Documents/Downloads/test2.csv", sep=",") >> test2 >> > DATE TIME > 1 18/01/2011 08:00:01 > 2 18/01/2011 08:10:01 > 3 18/01/2011 08:20:01 > 4 18/01/2011 08:30:01 > 5 19/01/2011 08:00:01 > 6 19/01/2011 08:10:01 > 7 19/01/2011 08:20:01 > 8 19/01/2011 08:30:01 > > >> test2$mytime <- strptime(test2$TIME,"%H:%M:%S") >> test2$mytime >> > [1] "2011-02-14 08:00:01" "2011-02-14 08:10:01" "2011-02-14 08:20:01" > "2011-02-14 08:30:01" "2011-02-14 08:00:01" > [6] "2011-02-14 08:10:01" "2011-02-14 08:20:01" "2011-02-14 08:30:01" > > >> test2 >> > DATE TIME mytime > 1 18/01/2011 08:00:01 2011-02-14 08:00:01 > 2 18/01/2011 08:10:01 2011-02-14 08:10:01 > 3 18/01/2011 08:20:01 2011-02-14 08:20:01 > 4 18/01/2011 08:30:01 2011-02-14 08:30:01 > 5 19/01/2011 08:00:01 2011-02-14 08:00:01 > 6 19/01/2011 08:10:01 2011-02-14 08:10:01 > 7 19/01/2011 08:20:01 2011-02-14 08:20:01 > 8 19/01/2011 08:30:01 2011-02-14 08:30:01 > > >> test2.sort <- order(test2$DATE, -test2$mytime) >> > Error in `-.POSIXt`(test2$mytime) : > unary '-' is not defined for "POSIXt" objects > > It's at this stage where I have got stuck as I'm new to R and don't yet know > a way of getting around this error. Thanks in advance. > > JonC > > > > > > > > > >