On Jun 14, 2009, at 6:33 PM, Chuck Cleland wrote:

On 6/14/2009 6:18 PM, Mark Na wrote:

Here's what I need to do (dummy example, my data are more complicated):

If type = A or B or C
    and status = a then count = 1
    and status = b then count = 2
    and status = c then count = 3

Else if type = D or E or F
    and status = a then count = 9
    and status = b then count = 8
    and status = c then count = 7

End

Seems simple when I write it like that, but the R code is escaping me.

mydf <- data.frame(type = sample(LETTERS[1:6], 40, replace=TRUE),
                  status = sample(letters[1:3], 40, replace=TRUE))

mydf$count <- with(mydf,
               ifelse(type %in% c('A','B','C') & status == 'a', 1,
               ifelse(type %in% c('A','B','C') & status == 'b', 2,
               ifelse(type %in% c('A','B','C') & status == 'c', 3,
               ifelse(type %in% c('D','E','F') & status == 'a', 9,
               ifelse(type %in% c('D','E','F') & status == 'b', 8,
               ifelse(type %in% c('D','E','F') & status == 'c', 7,
NA)))))))

Or more compactly and perhaps easier to maintain since you are approaching the nesting limits of ifelse and the OP said he had a more complex operation to perform:

library(car)
mydf$count <- with(mydf, ifelse( type %in% c('A','B','C'),
recode( status, " 'a'=1; 'b'=2; 'c'=3 ", FALSE),
                             ifelse( type %in% c('D','E','F') ,
recode( status, " 'a'=9; 'b'=8; 'c'=7 ", FALSE),
                                  NA)  )  )



David Winsemius, MD
Heritage Laboratories
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.

Reply via email to