David: Brilliant! Thanks very much. As Berend pointed out, I was not precise in the query, sorry. Please note in the example that we have a run of three state 2 after 0, and later another run of two state 2 after 0.
0 2 2 2 .... 0 0 2 2 Whenever the state moves from 0 to 2, I want to compute the mean of the run of values in state 2. I tried to modify David's example by doing the 'interaction' on states and runs: y <- rle(sss[,"State"]) yy <- cbind(y$lengths, y$values, c(NA, y$values[-length(y$values)])) colnames(yy) <- c("RunLength","State","PrevState") tapply(yy[,"RunLength"], INDEX=interaction(yy[,"PrevState"], yy[,"State"]), c) This gives me the list of runs for each transition-pair. Now I need to match these lists of runs against the corresponding rows in sss of values V1, V2, and compute stats on them. Is there an easier way? Thanks, Murali -----Original Message----- From: David Winsemius [mailto:dwinsem...@comcast.net] Sent: 20 February 2012 15:31 To: Menon Murali Cc: r-help@r-project.org Subject: Re: [R] stats on transitions from one state to another On Feb 20, 2012, at 10:11 AM, <murali.me...@avivainvestors.com> wrote: > Folks, > > I'm trying to get stats from a matrix for each transition from one > state to another. > > I have a matrix x as below. > > structure(c(0, 2, 2, 2, 0, 0, 0, 1, 1, 1, 1, 2, 2, 1, 1, 1, 0, > 0, 2, 2, 0.21, -0.57, -0.59, 0.16, -1.62, 0.18, -0.81, -0.19, > -0.76, 0.74, -1.51, 2.79, 0.41, 1.63, -0.86, -0.81, 0.39, -1.38, > 0.06, 0.84, 0.51, -1, -1.29, 2.15, 0.39, 0.78, 0.85, 1.18, 1.66, > 0.9, -0.94, -1.29, -0.23, -0.92, -0.21, 1.02, -0.77, -0.68, -0.33, > 0.04), .Dim = c(20L, 3L), .Dimnames = list(NULL, c("State", "V1", > "V2"))) > > Is it possible to get, say, mean values of each variable in state 1 > when the previous state was 0, in state 2 when the previous state > was 0, and so on with all available transitions between states 0, 1, > 2? > > In the above case, mean of V1 in state 2 when previous state was 0 > would be > > mean(c(-0.57, -0.59, 0.16, 0.06, 0.84)) = -0.02 > > while the mean of V1 in state 0 when previous state was 2 would be: > > mean(c(1.62, 0.18, -0.81)) = 0.33 > > If I try something like > > by(x[, 2:3], x[, 1], FUN = colMeans) > > I get the means for each state. I'm not sure how to get the split by > transition? Add an extra column of previous states: and tabulate: > sss <-cbind(sss, c(NA, sss[,"State"][-nrow(sss)]) ) > table(sss[,"State"], sss[,4]) 0 1 2 0 3 1 1 1 1 5 1 2 2 1 4 The requested means for "V1" by transition types: > tapply(sss[,"V1"], INDEX=interaction(sss[,"State"], sss[,4]), mean) 0.0 1.0 2.0 0.1 1.1 2.1 0.2 1.2 2.2 -0.670 -0.190 -0.255 0.390 -0.640 2.790 -1.620 1.630 0.205 The counts on which those means are based: > tapply(sss[,"V1"], INDEX=interaction(sss[,"State"], sss[,4]), length) 0.0 1.0 2.0 0.1 1.1 2.1 0.2 1.2 2.2 3 1 2 1 5 1 1 1 4 -- David Winsemius, MD West Hartford, CT ______________________________________________ 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.