Dear all, I am having trouble working out how I might do the following and would appreciate any thoughts. I am working with data concerning precipitation. The data are in 2 columns in a data frame called "storm" in the following format: HourCount - 1,2,3,4,5,6,7,8,...48 Amt - 0,0,0.3,3,4,8,10,15,12,6,4,3,0.2,0.2... There are 48 hours worth of data. I am trying to extract a storm. My storm is defined as a threshold - when the amount is greater than 2 for 2 hours the storm starts, and when the amount is less than 1 for two hours the storm ends. I can extract data above thresholds but it is obviously important to be able to extract consecutive records to capture the whole storm. Can anybody help? Thanks Jamie Ledingham PhD Researcher University of Newcastle Upon Tyne
Dear all, I am having trouble working out how I might do the following and would appreciate any thoughts. I am working with data concerning precipitation. The data are in 2 columns in a data frame called "storm" in the following format: HourCount - 1,2,3,4,5,6,7,8,...48 Amt - 0,0,0.3,3,4,8,10,15,12,6,4,3,0.2,0.2... There are 48 hours worth of data. I am trying to extract a storm. My storm is defined as a threshold - when the amount is greater than 2 for 2 hours the storm starts, and when the amount is less than 1 for two hours the storm ends. I can extract data above thresholds but it is obviously important to be able to extract consecutive records to capture the whole storm. Can anybody help? Thanks Jamie Ledingham PhD Researcher University of Newcastle Upon Tyne
Gabor Grothendieck
2008-Feb-27 18:22 UTC
[R] selecting consecutive records over a threshold
Convert the data frame to a zoo object and note that: diff(-rollmax(-z, 2) > 2) > 0 diff(rollmax(z, 2) < 1) > 0 have 1 at the start and end of the storm period respectively so that cumsum of their difference has ones for the storm period. In the last line we extract that portion. # input DF <- data.frame(HourCount = 1:14, Amt = c(0, 0, 0.3, 3, 4, 8, 10, 15, 12, 6, 4, 3, 0.2, 0.2)) library(zoo) z <- with(DF, zoo(Amt, HourCount)) r <- cumsum((diff(-rollmax(-z, 2) > 2) > 0) - (diff(rollmax(z, 2) < 1) > 0)) window(z, time(r[r > 0])) (You may have to use align="right" argument to both rollmax occurrences depending on how you want to define a storm period.) See ?rollmax and the three vignettes on the zoo package for more info. On Wed, Feb 27, 2008 at 12:00 PM, Jamie Ledingham <jamie.ledingham at newcastle.ac.uk> wrote:> > Dear all, > I am having trouble working out how I might do the following and would > appreciate any thoughts. > I am working with data concerning precipitation. The data are in 2 > columns in a data frame called "storm" in the following format: > > HourCount - 1,2,3,4,5,6,7,8,...48 > Amt - 0,0,0.3,3,4,8,10,15,12,6,4,3,0.2,0.2... > > There are 48 hours worth of data. I am trying to extract a storm. My > storm is defined as a threshold - when the amount is greater than 2 for > 2 hours the storm starts, and when the amount is less than 1 for two > hours the storm ends. > I can extract data above thresholds but it is obviously important to be > able to extract consecutive records to capture the whole storm. > > Can anybody help? > Thanks > Jamie Ledingham > PhD Researcher > University of Newcastle Upon Tyne > > ______________________________________________ > 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. >