[R] POSIXct coerced into numeric when filling a data frame

arun smartpink111 at yahoo.com
Mon Sep 24 18:30:30 CEST 2012


Hi,
Upon running your code, the "y" I am getting is:
y
#  ID      first     second
#1  a 1320003900 1320004800
#2  b 1320003000 1320003900

This you can convert back by:
within(y,{first<-as.POSIXct(first,origin="1970-01-01");second<-as.POSIXct(second,origin="1970-01-01")})
#  ID               first              second
#1  a 2011-10-30 20:45:00 2011-10-30 21:00:00
#2  b 2011-10-30 20:30:00 2011-10-30 20:45:00

A.K.




----- Original Message -----
From: Arnaud Duranel <arnaud.duranel.09 at ucl.ac.uk>
To: arun <smartpink111 at yahoo.com>
Cc: R help <r-help at r-project.org>
Sent: Monday, September 24, 2012 10:30 AM
Subject: [R] POSIXct coerced into numeric when filling a data frame

A.K., many thanks for your reply.
I have realised there was a mistake in my code, and that the example 
could have been clearer; my apologies for this, the corrected code is below:

> x<-list()
> x[["a"]]<-as.POSIXct(c("2011-08-27 10:45:00 GMT", "2011-10-30 
15:45:00 GMT", "2011-10-30 16:00:00 GMT", "2012-06-22 09:30:00 GMT", 
"2012-06-22 10:00:00 GMT"))
> x[["b"]]<-as.POSIXct(c("2011-08-27 11:00:00 GMT", "2011-10-30 
15:30:00 GMT", "2011-10-30 15:45:00 GMT", "2012-06-22 10:00:00 GMT"))
>
>
> x[[1]][as.Date(x[[1]])=="2011/10/30"][1]
[1] "2011-10-30 15:45:00 GMT"
>
> y<-data.frame()
> for (i in 1:length(x)) {
+   y[i,"ID"]<-names(x[i])
+   y[i,"first"]<-x[[i]][as.Date(x[[i]])=="2011/10/30"][1]
+   y[i,"second"]<-x[[i]][as.Date(x[[i]])=="2011/10/30"][2]
+ }
> y
   ID      first     second
1  a 1319989500 1319990400
2  b 1319988600 1319989500

where I would need:
> y
                ID                                   first              
         second
1              a     2011-10-30 15:45:00     2011-10-30 16:00:00
2              b     2011-10-30 15:30:00     2011-10-30 15:45:00

The POSIXct objects in my list do not have the same length; and I need 
to extract those POSIXct values that match a specific date (2011-10-30 
in this example), while keeping them in POSIXct format.

Many thanks
Arnaud


On 24/09/2012 13:29, arun wrote:
> HI,
> Try this:
> dat1<-do.call(data.frame,x)
> dat1<-data.frame(ID=letters[1:4],dat1)
> dat1
> #  ID               first              second
> #1  a 2011-08-27 10:45:00 2011-08-27 11:00:00
> #2  b 2011-10-30 15:45:00 2011-10-30 15:30:00
> #3  c 2011-10-30 16:00:00 2011-10-30 15:45:00
> #4  d 2012-06-22 09:30:00 2012-06-22 10:00:00
>   str(dat1)
> #'data.frame':    4 obs. of  3 variables:
> # $ ID    : Factor w/ 4 levels "a","b","c","d": 1 2 3 4
>   #$ first : POSIXct, format: "2011-08-27 10:45:00" "2011-10-30 15:45:00" ...
>   #$ second: POSIXct, format: "2011-08-27 11:00:00" "2011-10-30 15:30:00" ...
> dat2<-dat1
>   dat2$first<-as.Date(dat2$first,format="%Y-%m-%d %HH:MM:%SS")
>   dat2$second<-as.Date(dat2$second,format="%Y-%m-%d %HH:MM:%SS")
>   dat2
> #  ID      first     second
> #1  a 2011-08-27 2011-08-27
> #2  b 2011-10-30 2011-10-30
> #3  c 2011-10-30 2011-10-30
> #4  d 2012-06-22 2012-06-22
>   str(dat2)
> #'data.frame':    4 obs. of  3 variables:
> # $ ID    : Factor w/ 4 levels "a","b","c","d": 1 2 3 4
> # $ first : Date, format: "2011-08-27" "2011-10-30" ...
> # $ second: Date, format: "2011-08-27" "2011-10-30" ...
> dat2<-within(dat2,ID<-as.character(ID))
> subset(dat2,ID%in% c("a","b"))
> #  ID      first     second
> #1  a 2011-08-27 2011-08-27
> #2  b 2011-10-30 2011-10-30
>
>
> A.K.
>
>
>
>
> ----- Original Message -----
> From: Arnaud Duranel <arnaud.duranel.09 at ucl.ac.uk>
> To: r-help at r-project.org
> Cc:
> Sent: Monday, September 24, 2012 4:06 AM
> Subject: [R] POSIXct coerced into numeric when filling a data frame
>
> Hello
>
> I have a list of POSIXct objects, from which I want to extract those
> values that match a specific date, keeping them in POSIXct format. For a
> specific date there is 0-2 matching values.
> As an example (the actual list and objects are much longer):
>
> x<-list()
> x[["first"]]<-as.POSIXct(c("2011-08-27 10:45:00 GMT", "2011-10-30
> 15:45:00 GMT", "2011-10-30 16:00:00 GMT", "2012-06-22 09:30:00 GMT"))
> x[["second"]]<-as.POSIXct(c("2011-08-27 11:00:00 GMT", "2011-10-30
> 15:30:00 GMT", "2011-10-30 15:45:00 GMT", "2012-06-22 10:00:00 GMT"))
>
> If I use the following expression for one specific object of the list, I
> get the result I expect:
>
> x[[1]][as.Date(x[[1]])=="2011/10/30"][1]
>
> [1] "2011-10-30 15:45:00 GMT"
>
>
> Now if I write a for loop based on that expression to store the values
> of interest in a data frame, the POSIXct values are coerced into numeric:
>
> y<-data.frame()
> for (i in 1:length(x)) {
>     y[i,"ID"]<-names(x[i])
>     y[i,"first"]<-x[[i]][as.Date(x[[i]])=="2011/10/30"][1]
>     y[i,"second"]<-x[[i]][as.Date(x[[i]])=="2011/10/30"][2]
> }
>
>     ID      first     second
> 1  a 1319989500 1319990400
> 2  b 1319988600 1319989500
>
>
> I am a bit confused about why that is.
> I could coerce them back to POSIXct with another line of code, but is
> there a better way? And is there a way to avoid using a for loop to
> complete this task?
> No need to say I am quite new to R, so apologies for any obvious mistake
> or oversight.
>
> Many thanks
>
> A. Duranel, UCL Department of Geography
>
>
>      [[alternative HTML version deleted]]
>
> ______________________________________________
> 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.
>
>
> .
>




More information about the R-help mailing list