Is this what you want: > test.data x group 1 32.66782 A 2 50.02132 A 3 43.69700 A 4 46.59031 A 5 38.43428 A 6 68.03142 A 7 46.68868 A 8 33.94487 A 9 51.97193 A 10 52.63176 A 11 40.14173 B 12 21.11079 B 13 43.59518 B 14 55.70508 B 15 49.40277 B 16 49.01821 B 17 55.60821 B 18 38.13541 B 19 60.96777 B 20 49.94656 B > test.data$z <- ave(test.data$x, > test.data$group,FUN=function(z){(z-mean(z))/sd(z)}) > test.data x group z 1 32.66782 A -1.33241490 2 50.02132 A 0.34308231 3 43.69700 A -0.26753700 4 46.59031 A 0.01181557 5 38.43428 A -0.77565765 6 68.03142 A 2.08197466 7 46.68868 A 0.02131284 8 33.94487 A -1.20911451 9 51.97193 A 0.53141612 10 52.63176 A 0.59512257 11 40.14173 B -0.54637780 12 21.11079 B -2.21770874 13 43.59518 B -0.24308968 14 55.70508 B 0.82042267 15 49.40277 B 0.26694269 16 49.01821 B 0.23317041 17 55.60821 B 0.81191546 18 38.13541 B -0.72257633 19 60.96777 B 1.28260182 20 49.94656 B 0.31469951 >
On 9/27/07, [EMAIL PROTECTED] <[EMAIL PROTECTED]> wrote: > > tapply is also very useful: > > > my.df<-data.frame(x=rnorm(20, 50, 10),group=factor(sort(rep(c("A", "B"), > 10)))) > tapply(my.df$x,my.df$group,function(x){(x-mean(x))/sd(x)}) > > > > -----Original Message----- > From: [EMAIL PROTECTED] > [mailto:[EMAIL PROTECTED] Behalf Of Matthew Dubins > Sent: 26 September 2007 21:57 > To: r-help@r-project.org > Subject: [R] Getting group-wise standard scores of a vector > > > Hi, > > I want to be able to create a vector of z-scores from a vector of > continuous data, conditional on a group membership vector. > > Say you have 20 numbers distributed normally with a mean of 50 and an sd > of 10: > > x <- rnorm(20, 50, 10) > > > Then you have a vector that delineates 2 groups within x: > > group <- sort(rep(c("A", "B"), 10)) > > test.data <- data.frame(cbind(x, group)) > > I know that if you break up the x vector into 2 different vectors then > it becomes easy to calculate the z scores for each vector, then you > stack them and append them to the original > data frame. Is there anyway to apply this sort of calculation without > splitting the original vector up? I tried a really complex ifelse > statement but it didn't seem to work. > > Thanks in advance, > Matthew Dubins > > ______________________________________________ > 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. > > ______________________________________________ > 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. > -- Jim Holtman Cincinnati, OH +1 513 646 9390 What is the problem you are trying to solve? ______________________________________________ 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.