POSIXct coerced into numeric when filling a data frame
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.