On Jun 7, 2011, at 9:25 AM, davetracz wrote: > I am performing a precipitation analysis. data is in the form of daily > precipitation amounts, e.g. > > x<- c(4,5,3,0,0,0,2,4,6,4,0,0,0,2,2,0,3,4,1,0,...) > > I would like to find the length of the "storm", length of storm would be > defined as the number of days with continues precipitation. in this case the > returned vector would be: > > (3,4,2,3,...) > > I would also like the amount of precipitation associated with each "storm" > in another variable. in this case the variable would look like: > > (12,16,4,8,...) > > any suggestions would be appreciated. > > thanks > Dave
?rle will be useful here x <- c(4, 5, 3, 0, 0, 0, 2, 4, 6, 4, 0, 0, 0, 2, 2, 0, 3, 4, 1, 0) # Get the runs of values in 'x' >= 1 R1 <- rle(x >= 1) > R1 Run Length Encoding lengths: int [1:8] 3 3 4 3 2 1 3 1 values : logi [1:8] TRUE FALSE TRUE FALSE TRUE FALSE ... # Split 'x' by the sequences of values >= 1 in 'R1' # The values will be grouped by integers, including '0s' # > rep(cumsum(R1$values) * R1$values, R1$lengths) # [1] 1 1 1 0 0 0 2 2 2 2 0 0 0 3 3 0 4 4 4 0 # so we want to remove the first '0' group R2 <- split(x, rep(cumsum(R1$values) * R1$values, R1$lengths))[-1] > R2 $`1` [1] 4 5 3 $`2` [1] 2 4 6 4 $`3` [1] 2 2 $`4` [1] 3 4 1 Now use normal list processing to get the lengths and sums > sapply(R2, length) 1 2 3 4 3 4 2 3 > sapply(R2, sum) 1 2 3 4 12 16 4 8 HTH, Marc Schwartz ______________________________________________ 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.