Вот возможное решение Plyr . Обратите внимание, что он опирается на базовую transform()функцию.
my.df <- data.frame(x=rnorm(100, mean=10),
sex=sample(c("M","F"), 100, rep=T),
group=gl(5, 20, labels=LETTERS[1:5]))
library(plyr)
ddply(my.df, c("sex", "group"), transform, x.std = scale(x))
(Мы можем проверить, работает ли он, как ожидалось, например, with(subset(my.df, sex=="F" & group=="A"), scale(x)))
В основном, 2-й аргумент описывает, как «разбить» данные, 3-й аргумент - какую функцию применять к каждому чанку. Выше добавит переменную x.stdк data.frame. Используйте, xесли вы хотите заменить исходную переменную на масштабированную.