如何按组缩放矩阵?

how to scale a matrix by group?

我有一个示例数据如下,我想通过 sex 和 return 相同的数据结构来缩放 x, y, z。如何编写代码来实现它。我只能按组 sex 成功缩放一列而不是矩阵 my.df。有人可以帮助我,在此先感谢。 此外,如果我只是缩放矩阵 my.df,而不是 sexscale 效果很好。

set.seed(2016)
my.df <- data.frame(x=rnorm(100, mean=10), 
                        y=rnorm(100, mean=33),
                        z=runif(100,1,300),
                        sex=sample(c("M","F"), 100, rep=T), 
                        group=gl(5, 20, labels=LETTERS[1:5]))

以下代码根本不起作用。

library(plyr)
ddply(my.df, .(sex), transform, scale)
apply(my.df, 2, function(x) ddply(x, .(my.df$sex), scale(x)))
apply(my.df[1:3], 2, function(x) tapply(x, my.df$sex, scale))

我们可以使用data.table。将 'data.frame' 转换为 'data.table' (setDT(my.df),按 'sex' 分组,选择 .SDcols 中感兴趣的列,我们遍历列 (lapply(.SD, ...) ,做scale并转换为vector。(scale函数输出一个带有一些属性的矩阵,如果我们不转换为[=16=会产生一些问题].)

library(data.table)
setDT(my.df)[, c('x', 'y', 'z') := lapply(.SD, function(x) 
          as.vector(scale(x))) , by = sex, .SDcols= x:z]