Вот возможное решение 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
если вы хотите заменить исходную переменную на масштабированную.