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...@ucl.ac.uk> To: arun <smartpink...@yahoo.com> Cc: R help <r-help@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...@ucl.ac.uk> > To: r-help@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@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@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.