[R] tapply and storage

Floris Van Ogtrop f.vanogtrop at usyd.edu.au
Wed Apr 11 01:53:39 CEST 2007


Dear R-Users,

I have the following problem of which I have provided a simple example.
Using the tapply command I can efficiently run the function genflo for
all months and years. I am new to R and I do not understand how I can
store the results of f such that as the function loops through the
months, I can retrieve the tail value of f from the previous month and
use this as a condition for the current month iteration (note the
comments in the code).
Forgive me if I am not clear.

Thanks in advance

Floris   

year <- c(1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972,
1972, 1972)
month <- c(1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3)
discharge <- c(100921, 89885, 81493, 74876, 70579, 68305, 66337, 63095,
58446, 52674, 44028, 31956)
n11 <- c(1,1,1,1,1,1,1,1,1,1,1,1)
n00 <- c(0,0,0,0,0,0,0,0,0,0,0,0)
n01 <- c(0,0,0,0,0,0,0,0,0,0,0,0)
n10 <- c(0,0,0,0,0,0,0,0,0,0,0,0)
flow_data <- data.frame(year, month, discharge, n11, n00, n01, n10)

genflo <- function(X)
{
  n <- nrow(X)
  if((sum(X$n11) + sum(X$n10)) > 0) {
 	  Pww <- sum(X$n11)/(sum(X$n11) + sum(X$n10))
  } else
    {Pww <- 0}
  if((sum(X$n00) + sum(X$n01)) > 0) {
 	  Pdd <- sum(X$n00)/(sum(X$n00) + sum(X$n01))
 	} else
    {Pdd <- 0}
  r <- vector(length = n)
 	rand <- runif(r, 0, 1)
  f <- vector(length = n)	 # 
  for (i in 2:n) {		 #
    if(X$discharge[i-1] > 0) { # X$discharge needs to be replaced by
                               # the tail value of f from the
# previous iteration (month) 
   	  if(rand[i] > Pww) {
        f[i] <- 0
     	} else
        {f[i] <- 1}
   	} else
      {if(rand[i] > Pdd){
        f[i] <- 1
      } else
        {f[i] <- 0}
 	  }
 	}
 	return(f)
}

gen_flow_days <- by(flow_data, list(month = flow_data[,2], year =
flow_data[,1]), genflo)
gen_flow_days <- unlist(gen_flow_days)



More information about the R-help mailing list