如何按组缩放矩阵?
how to scale a matrix by group?
我有一个示例数据如下,我想通过 sex
和 return 相同的数据结构来缩放 x, y, z
。如何编写代码来实现它。我只能按组 sex
成功缩放一列而不是矩阵 my.df
。有人可以帮助我,在此先感谢。
此外,如果我只是缩放矩阵 my.df
,而不是 sex
,scale
效果很好。
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]
我有一个示例数据如下,我想通过 sex
和 return 相同的数据结构来缩放 x, y, z
。如何编写代码来实现它。我只能按组 sex
成功缩放一列而不是矩阵 my.df
。有人可以帮助我,在此先感谢。
此外,如果我只是缩放矩阵 my.df
,而不是 sex
,scale
效果很好。
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]