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

arun smartpink111 at yahoo.com
Mon Sep 24 19:25:37 CEST 2012


Hi,

You can also try this:
 x1<-list(a=data.frame(x[["a"]]),b=data.frame(x[["b"]]))
library(plyr)
x2<-do.call(rbind.fill,x1)
colnames(x2)<-c("a","b")
x2first<-subset(x2,format(a,"%Y-%m-%d")=="2011-10-30" )
 x2second<-subset(x2,format(b,"%Y-%m-%d")=="2011-10-30" )
y<-data.frame(t(data.frame(a=x2first[,1],b=x2second[,2])))
colnames(y)<-c("first","second")
 y<-data.frame(ID=row.names(y),y)
y<-within(y,{first<-as.POSIXct(first);second<-as.POSIXct(second)})
 y
#  ID               first              second
#a  a 2011-10-30 15:45:00 2011-10-30 16:00:00
#b  b 2011-10-30 15:30:00 2011-10-30 15:45:00
str(y)
#'data.frame':    2 obs. of  3 variables:
# $ ID    : Factor w/ 2 levels "a","b": 1 2
# $ first : POSIXct, format: "2011-10-30 15:45:00" "2011-10-30 15:30:00"
 #$ second: POSIXct, format: "2011-10-30 16:00:00" "2011-10-30 15: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:42 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