Try this: DS <- structure(list(anomaly = c(-27.3, 14.4, 29, -38.1, -3.4, 55.1, -1, 21.9, -10.9, -7.8, -48.2, -44.9, -43.8, -10.3, 44.2, -0.5, 96.7, -32, -0.2, -38.6, 73.6, -17.5, -57.8, 10.7, -33.4, 46.1, 26.7, -37.3, 1.2, 36.3, 39.6, 31), prev6mon = c(NA, NA, NA, NA, NA, 29.7, 56, 63.5, 23.6, 53.9, 9.1, -91, -133.8, -166, -110.8, -103.5, 41.4, 54.3, 97.9, 69.6, 99.1, 82.1, -72.4, -29.7, -62.9, 21.7, -25.2, -45.1, 14, 39.6, 112.7, 97.6), DSI = c(NA, NA, NA, NA, NA, NA, 0, 0, 0, 0, 0, -48.17, -93.08, -136.93, -147.21, -102.98, -103.47, 0, 0, 0, 0, 0, -17.47, -75.29, -64.57, -98.01, 0, 0, 0, 0, 0, 0), DSIadj = c(NA, NA, NA, NA, NA, NA, 0, 0, 0, 0, 0, 0.06, 0.12, 0.17, 0.18, 0.13, 0.13, 0, 0, 0, 0, 0, 0.02, 0.09, 0.08, 0.12, 0, 0, 0, 0, 0, 0), DSIpct = c(NA, NA, NA, NA, NA, NA, 0, 0, 0, 0, 0, 6.02, 11.64, 17.12, 18.4, 12.87, 12.94, 0, 0, 0, 0, 0, 2.18, 9.41, 8.07, 12.25, 0, 0, 0, 0, 0, 0), Month = structure(c(5L, 4L, 8L, 1L, 9L, 7L, 6L, 2L, 12L, 11L, 10L, 3L, 5L, 4L, 8L, 1L, 9L, 7L, 6L, 2L, 12L, 11L, 10L, 3L, 5L, 4L, 8L, 1L, 9L, 7L, 6L, 2L), .Label = c("April ", "Aug ", "Dec ", "Feb ", "Jan", "July ", "June ", "March ", "May ", "Nov ", "October ", "Sept "), class = "factor"), Yr = c(1980L, 1980L, 1980L, 1980L, 1980L, 1980L, 1980L, 1980L, 1980L, 1980L, 1980L, 1981L, 1981L, 1981L, 1981L, 1981L, 1981L, 1981L, 1981L, 1981L, 1981L, 1981L, 1981L, 1981L, 1982L, 1982L, 1982L, 1982L, 1982L, 1982L, 1982L, 1982L)), .Names = c("anomaly", "prev6mon", "DSI", "DSIadj", "DSIpct", "Month", "Yr"), class = "data.frame", row.names = c(NA, -32L)) DS # original data # now only use the first column of data and construct columns B & C # fill in the 'prev6mon' column using filter and zero the DSI column DS$prev6mon <- filter(DS$anomaly, rep(1,6), side=1) DS$DSI <- 0 # iterate since you have to refer to a previous value for (i in 7:nrow(DS)){ DS$DSI[i] <- with(DS, { if (DSI[i - 1] < 0) { if (prev6mon[i - 1] < 0) DSI[i - 1] + anomaly[i - 1] else 0 } else { if (prev6mon[i] >= 0) 0 else { if (anomaly[i - 1] >= 0) 0 else anomaly[i - 1] } } }) }
On Sat, Jan 16, 2010 at 2:57 PM, Muhammad Rahiz < muhammad.ra...@ouce.ox.ac.uk> wrote: > Dear all, > > I'm trying to make an R code for the drought severity index (DSI) developed > by Philips and McGregor (1998). You can refer to the description of the > algorithm on page 19 from > http://dissertations.port.ac.uk/229/01/MaloneS.pdf > > The code is given in Excel as the following and can be found on page 60 > from the same link. > > C7 = > IF(C6<0,IF(@SUM(A6:A1)<0,C6+A6,"0"), > IF(B7>=0,"0",IF(A6>=0,"0",A6))) > > Column A contains the raw anomaly data. Column B contains the 6month > rolling sum and Column C contains the results of the conditional statement > which in turn is recycled and input into the conditional statement. > > I translated the Excel formula into R, but without any success. > > x <- as.matrix(read.table("sample.txt")) # where sample.txt contains values > of anomalies. See page 60 > > ct <- 6 # sets a 6-month averaging sequence > n <- ct -1 > d <- matrix( ,32,1) # dummy file > > # User defined function > add <- function(x) Reduce("+", x) > > for (i in 1:32){ > ii <- i + n > a <- i +1 > > d[[a]] <- > > ifelse(d[ii] < 0 && add(x[c(i:ii)]) < 0, d[ii] + x[ii], ( # condition 1 > ifelse(add(x[c((i+1):(ii+1))]) >= 0, 0, ( # condition 2 > ifelse(x[ii] >=0,"0", x[ii]))))) # condition 3 > } > > The way I see it, this is the main problem. > > How do I make the data in Excel's Column C in R? Or in other words, how do > I update the result of the conditional statements into the dummy file, d, > which I created (which apparently didn't work). > > I hope my explanation makes sense. > > thanks. > > > Muhammad > > -- > Muhammad Rahiz | Doctoral Student in Regional Climate Modeling > Climate Research Laboratory, School of Geography & the Environment > Oxford University Centre for the Environment, University of Oxford > South Parks Road, Oxford, OX1 3QY, United Kingdom > Tel: +44 (0)1865-285194 Mobile: +44 (0)7854-625974 > Email: muhammad.ra...@ouce.ox.ac.uk<mailto:muhammad.ra...@ouce.ox.ac.uk> > > ______________________________________________ > 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. > -- Jim Holtman Cincinnati, OH +1 513 646 9390 What is the problem that you are trying to solve? [[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.