Dimitri Liakhovitski
2010-Apr-07 14:37 UTC
[R] Specifying parameters for use in "plyr" / "ddply"
Dear R-ers! # I have a data frame with one factor and 2 numeric variables: x<-data.frame(group=c("b","b","d","d","e","e"),a=c(1,NA,10,20,100,200),b=c(5,15,20,NA,10,30)) x # I want to divide each value of each variable by its group mean - using plyr and ddply. It works fine, for example, for variable "a": library(plyr) x2<-ddply(x, "group", transform, a = a / mean(a, na.rm = T)) x2 # Because I want to do the same for both variables (a and b) I want to put it into a function. # So, I am parametrising the grouping variable and the variable to transform. # However, my code below is not working - I know that x[[variable]] is not correct - but what is the right way of doing it? grouping.factor<-"group" variable<-"a" x2<-ddply(x, grouping.factor, transform, x[[variable]] = x[[variable]] / mean(x[[variable]], na.rm = T)) Or is there a more effective way of using ddply on a bunch of variables? Thank you very much for your advise! -- Dimitri Liakhovitski Ninah.com Dimitri.Liakhovitski at ninah.com
On 2010-04-07 8:37, Dimitri Liakhovitski wrote:> Dear R-ers! > > # I have a data frame with one factor and 2 numeric variables: > x<-data.frame(group=c("b","b","d","d","e","e"),a=c(1,NA,10,20,100,200),b=c(5,15,20,NA,10,30)) > x > > # I want to divide each value of each variable by its group mean - > using plyr and ddply. It works fine, for example, for variable "a": > library(plyr) > x2<-ddply(x, "group", transform, a = a / mean(a, na.rm = T)) > x2 > > # Because I want to do the same for both variables (a and b) I want to > put it into a function. > # So, I am parametrising the grouping variable and the variable to transform. > # However, my code below is not working - I know that x[[variable]] is > not correct - but what is the right way of doing it? > grouping.factor<-"group" > variable<-"a" > x2<-ddply(x, grouping.factor, transform, x[[variable]] = x[[variable]] > / mean(x[[variable]], na.rm = T)) > > > Or is there a more effective way of using ddply on a bunch of variables? > Thank you very much for your advise! >Yes, there is: colwise() f <- function(x) x / mean(x, na.rm = TRUE) ddply(x, "group", colwise(f, c("a", "b"))) -- Peter Ehlers University of Calgary