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

jim holtman jholtman at gmail.com
Mon Sep 24 18:57:29 CEST 2012


Try this; does away with the 'for', but have to convert back to
POSIXct since sapply strips off the class:


> 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 EDT"
>
> # convert to POSIXct
> unix2POSIXct <- function (time) structure(time, class = c("POSIXct", "POSIXt"))
>
>
> y <- data.frame(ID = names(x)
+     , first = unix2POSIXct(sapply(x, function(d) d[as.Date(d) ==
"2011-10-30"][1]))
+     , second = unix2POSIXct(sapply(x, function(d) d[as.Date(d) ==
"2011-10-30"][2]))
+     )
> 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


On Mon, Sep 24, 2012 at 10:30 AM, Arnaud Duranel
<arnaud.duranel.09 at ucl.ac.uk> wrote:
> 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.
>>
>>
>> .
>>
>
> ______________________________________________
> 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?
Tell me what you want to do, not how you want to do it.




More information about the R-help mailing list