On Thu, Feb 23, 2012 at 04:40:07PM -0000, Ted Harding wrote: [...] > A basic solution for this special case would be > > zt=function(x){ > if (sd(x) == 0) return(0*x) else return( (x-mean(x))/sd(x) ) > } > > This should cover the case where length(table(x))==1 (see also below). > > I'm not happy about your conditions > > if (length(table(x)>1)) > if (length(table(x)==1)) > > since they ask for "length(table(x)>1)", which doesn't seem > to represent any natural criterion. E.g.: > > length(table(1:10)>1) > # [1] 10 > length(table(rep(1,10))>1) > # [1] 1 > > if(length(table(1:10)>1)) y <- "Yes" else y <- "No" ; y > # [1] "Yes" > if(length(table(rep(1,10))>1)) y <- "Yes" else y <- "No" ; y > # [1] "Yes" > > length(table(1:10)==1) > # [1] 10 > length(table(rep(1,10))==1) > # [1] 1 > > if(length(table(1:10)==1)) y <- "Yes" else y <- "No" ; y > # [1] "Yes" > if(length(table(rep(1,10))==1)) y <- "Yes" else y <- "No" ; y > # [1] "Yes" > > I suspect you meant to write > > if (length(table(x))>1) > and > if (length(table(x)))==1) > > since this distinguishes between two more more different values > (length(table(x)) > 1) and all equal values (length(table(x)) == 1).
Hi. The condition length(table(x)) > 1 may also be written as lentgh(unique(x)) > 1. These two conditions are usually equivalent, but not always due to the rounding to 15 digits performed in table(). For example x <- 1 + (0:10)*2^-52 length(table(x)) # [1] 1 length(unique(x)) # [1] 11 sd(x) # [1] 7.364386e-16 diff(x) # [1] 2.220446e-16 2.220446e-16 2.220446e-16 ... Petr Savicky. ______________________________________________ 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.