Nice! It works. Thank you, Rui There's something that takes me back to the original question, though. The code takes the first value that meets the critical condition (light ==0); however, this value can appear more than once a day because these animals nest in dark caves, and once they are in the logger sensor registers a 0. So, a second condition limiting the time at which the critical condition can be accepted to calculate dusk should be implemented; something like (although R doesn't allow to impose the double condition): if (05:00:00<z$clock> 17:00:00) {zrle <- rle(x$lig == 0)} Santi
From: Rui Barradas <ruipbarra...@sapo.pt> >To: Santiago Guallar <sgual...@yahoo.com> >Cc: r-help@r-project.org >Sent: Wednesday, July 18, 2012 11:37 AM >Subject: Re: [R] Imposing more than one condition to if > >hELLO, > >There was no nedd to change the names of the variables inside the >fucntion. What was going on s that in this new file column 'dtime' >doesn't exist. Since column 'clock' exists in all files, I've changed >the function once again, making it more general. > >Note that there is an argument 'colTime' with a default value. In the >function's use below I call it with and without that argument. > > >f <- function(x, colTime="clock"){ > zrle <- rle(x$lig == 0) > if(zrle$values[1]){ > idusk <- sum(zrle$lengths[1:2]) + 1 > idawn <- zrle$lengths[1] + 1 > x$dusk <- x[ idusk , colTime ] > x$dawn <- x[ idawn , colTime ] > }else{ > idusk <- zrle$lengths[1] + 1 > x$dusk <- x[ idusk , colTime ] > x$dawn <- NA > } > x >} > >str(d) >#d$date <- as.Date(d$date, format="%d/%m%/y") > >#library(chron) >#tm <- times(as.character(d$clock)) >#d$clock <- tm > ># See what will happen. This call uses the default 'colTime' >bb <- by(d, d$date, f) >for(i in seq_along(bb)) print(head(bb[[i]], 1)) > ># call and rbind. This call uses explicit arg 'colTime' >do.call(rbind, by(d, d$date, f, colTime="clock")) > ># Alternatively, it could be, because 'bb' is already created, >do.call(rbind, bb) > > >In the code above, I use an optional conversion to date and time >classes; as.Date is part of base R, but class times needs package chron. >It's a good idea to convert these variables, you can later use, say, >arithmetics on dates and times, such as differences. > >Hope this helps, > >Rui Barradas > >Em 17-07-2012 19:53, Santiago Guallar escreveu: >> Thank for your time, Rui. >> Now, I get this error message: >> Error en rbind(deparse.level, ...) : >> numbers of columns of arguments do not match >> Apparently, some columns have missing values and rbind doesn't work. I >> tried: >> require(plyr) >> do.call(rbind.fill, by(z, z$date, f)) >> Then the code runs through but dusk the variable dusk is missing and >> dawn is filled with NA. >> Just in case the problem simply lies in a name, this is your code after >> I changed the object names (basically 'x' and 'd' by 'z') to adapt them >> to the names of my dataset: >> f <- function(z){ >> zrle <- rle(z$lig == 0) >> if(zrle$values[1]){ >> idusk <- sum(zrle$lengths[1:2]) + 1 >> idawn <- zrle$lengths[1] + 1 >> z$dusk <- z$dtime[ idusk ] >> z$dawn <- z$dtime[ idawn ] >> }else{ >> idusk <- zrle$lengths[1] + 1 >> z$dusk <- z$dtime[ idusk ] >> z$dawn <- NA >> } >> z >> } >> >> do.call(rbind, by(z, z$date, f)) >> Again, I attached a dput() with the object z which contains my dataset. >> Santi >> >> *From:* Rui Barradas <ruipbarra...@sapo.pt> >> *To:* Santiago Guallar <sgual...@yahoo.com> >> *Cc:* r-help@r-project.org >> *Sent:* Tuesday, July 17, 2012 11:52 AM >> *Subject:* Re: [R] Imposing more than one condition to if >> >> >> Hello, >> >> My code couldn't find the right input columns because your real >> data has >> different names, it could only find the example dataset's names. >> >> And there's another problem, my code would give correct answers >> with a >> limted number of possible inputs and fail with real data. >> >> Corrected: >> >> >> f <- function(x){ >> zrle <- rle(x$lig == 0) >> if(zrle$values[1]){ >> idusk <- sum(zrle$lengths[1:2]) + 1 >> idawn <- zrle$lengths[1] + 1 >> x$dusk <- x$dtime[ idusk ] >> x$dawn <- x$dtime[ idawn ] >> }else{ >> idusk <- zrle$lengths[1] + 1 >> x$dusk <- x$dtime[ idusk ] >> x$dawn <- NA >> } >> x >> } >> >> do.call(rbind, by(d, d$date, f)) >> >> >> One more thing, you are reading your dataset into a data.frame >> forgetting that character strings become factors. Try str(d) to >> see it. >> ('d' is the data.frame.) You could/should coerce the date/time >> values to >> appropriate classes, something like >> >> >> d$time <- as.character(d$time) >> d$time <- as.POSIXct(d$time, format="%d/%m/%y %H:%M:%S") >> d$date <- as.character(d$date) >> d$date <- as.Date(d$date, format="%d/%m/%y") >> >> >> Hope this helps, >> >> Rui Barradas >> >> Em 17-07-2012 07:14, Santiago Guallar escreveu: >> > Thank you Rui, >> > >> > When applied to my original data, your code goes through >> although it >> > does not produce the correct results: for dusk gives the >> first time >> > value of next day, for dawn it gives NA. It seems that the >> function f >> > doesn't find the right input columns. >> > A, Ilso had to push up the memory size. >> > Attached a file (containing just 3000 of the original c. >> 45000 rows) >> > after dput(). >> > >> > Santi >> > >> > >> > >> >>------------------------------------------------------------------------ >> > *From:* Rui Barradas <ruipbarra...@sapo.pt >> <mailto:ruipbarra...@sapo.pt>> >> > *To:* Santiago Guallar <sgual...@yahoo.com >> <mailto:sgual...@yahoo.com>> >> > *Cc:* r-help@r-project.org <mailto:r-help@r-project.org> >> > *Sent:* Sunday, July 15, 2012 7:21 PM >> > *Subject:* Re: [R] Imposing more than one condition to if >> > >> > Hello, >> > >> > There are obvious bugs in your code, you are testing for >> light > 2 or >> > ligth < 2 but this would mean that dusk and dawn are >> undetermined for >> > light == 2 and that they happen at light == 1. >> > >> > Without loops or compound logical conditions: >> > >> > >> > f <- function(x){ >> > x$dawn <- x$time[ which.min(x$light) ] >> > x$dusk <- x$time[ max(which(x$light == 0)) + 1 ] >> > x >> > } >> > >> > do.call(rbind, by(d, d$day, f)) >> > >> > Hope this helps, >> > >> > Rui Barradas >> > >> > Em 15-07-2012 17:32, Santiago Guallar escreveu: >> > > Hi, >> > > >> > > I have a dataset which contains several time records for >> a number >> > of days, plus a variable (light) that allows to determine >> night time >> > (lihgt= 0) and daytime (light> 0). I need to obtain get >> dusk time >> > and dawn time for each day and place them in two columns. >> > > >> > > This is the starting point (d): >> > > day time light >> > > 1 1 20 >> > > 1 12 10 >> > > 1 11 6 >> > > 1 9 0 >> > > 1 6 0 >> > > 1 12 0 >> > > ... >> > > 30 8 0 >> > > 30 3 0 >> > > 30 8 0 >> > > 30 3 0 >> > > 30 8 8 >> > > 30 9 20 >> > > >> > > >> > > And this what I want to get: >> > > day time light dusk dawn >> > > 1 1 20 11 10 >> > > 1 12 10 11 10 >> > > 1 11 6 11 10 >> > > 1 9 0 11 10 >> > > 1 6 0 11 10 >> > > 1 12 0 11 10 >> > > ... >> > > 30 8 0 9 5 >> > > 30 3 0 9 5 >> > > 30 8 0 9 5 >> > > 30 3 0 9 5 >> > > 30 8 8 9 5 >> > > 30 9 20 9 5 >> > > >> > > This is the code for data frame d: >> > > day= rep(1:30, each=10) >> > > n= length(dia); x= c(1:24) >> > > time= sample(x, 300, replace= T) >> > > light= rep(c(20,10,6,0,0,0,0,0,8,20), 30) >> > > d=data.frame(day,time,light) >> > > >> > > I'd need to impose a double condition like the next >> but if does >> > not take more than one: >> > > attach(d) >> > > for (i in 1: n){ >> > > if (light[i-1]>2 & light[i]<2){ >> > > d$dusk<- time[i-1] >> > > } >> > > if (light[i-1]<2 & light[i]>2){ >> > > d$dawn<- time[i] >> > > } >> > > } >> > > detach(d) >> > > d >> > > >> > > Thank you for your help >> > > [[alternative HTML version deleted]] >> > > >> > > >> > > >> > > ______________________________________________ >> > > R-help@r-project.org <mailto:R-help@r-project.org> >> <mailto:R-help@r-project.org <mailto: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 >> <http://www.r-project.org/posting-guide.html> >> > > and provide commented, minimal, self-contained, >> reproducible code. >> > > >> > >> > >> > >> >> >> >> >> > > > > [[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.