try this: > set.seed(1) > day= rep(1:30, each=10) > n= length(day); 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) > > # create a dawn/dusk column to mark where it happens > d$dawn <- c(FALSE, (head(d$light, -1) < 2) & (tail(d$light, -1) > 2)) > d$dusk <- c((head(d$light, -1) > 2) & (tail(d$light, -1) < 2), FALSE) > > # now split and recombine to get the values for the day > result <- do.call(rbind, lapply(split(d, d$day), function(.day){ + # create new dataframe with the values + cbind(.day[, c('day', 'time', 'light')] + , dawn = .day$time[.day$dawn] + , dusk = .day$time[.day$dusk] + ) + })) > > > > result day time light dawn dusk 1.1 1 7 20 16 14 1.2 1 9 10 16 14 1.3 1 14 6 16 14 1.4 1 22 0 16 14 1.5 1 5 0 16 14 1.6 1 22 0 16 14 1.7 1 23 0 16 14 1.8 1 16 0 16 14 1.9 1 16 8 16 14 1.10 1 2 20 16 14 2.11 2 5 20 10 17 2.12 2 5 10 10 17 2.13 2 17 6 10 17 2.14 2 10 0 10 17 2.15 2 19 0 10 17 2.16 2 12 0 10 17 2.17 2 18 0 10 17 2.18 2 24 0 10 17 2.19 2 10 8 10 17 2.20 2 19 20 10 17 3.21 3 23 20 21 16 3.22 3 6 10 21 16 3.23 3 16 6 21 16 3.24 3 4 0 21 16 3.25 3 7 0 21 16 3.26 3 10 0 21 16 3.27 3 1 0 21 16 3.28 3 10 0 21 16 3.29 3 21 8 21 16 3.30 3 9 20 21 16 4.31 4 12 20 18 12 4.32 4 15 10 18 12 4.33 4 12 6 18 12 4.34 4 5 0 18 12 4.35 4 20 0 18 12 4.36 4 17 0 18 12 4.37 4 20 0 18 12 4.38 4 3 0 18 12 4.39 4 18 8 18 12 4.40 4 10 20 18 12
On Sun, Jul 15, 2012 at 12:32 PM, Santiago Guallar <sgual...@yahoo.com> wrote: > 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 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. ______________________________________________ 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.