【问题标题】:how to scale a matrix by group?如何按组缩放矩阵?
【发布时间】:2016-01-21 10:47:16
【问题描述】:

我有一个示例数据如下,我想将x, y, z 缩放sex,并返回相同的数据结构。如何编写代码来实现它。我可以按组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))

【问题讨论】:

  • 我想你可以试试这个by(my.df[,c(-4,-5)], my.df$sex, scale)
  • 对不起,它不适用于矩阵

标签: r matrix scale


【解决方案1】:

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

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

【讨论】:

  • 现在我有一个 200 列的矩阵,我应该如何修改代码以自动读取 c('x','y','z') 和 .SDcols = x 中的列名: z。 @akrun
  • @TaoZhang 您可以使用names,即如果您希望列2:190 被缩放,即setDT(my.df)[, names(mydf)[2:190] := lapply(.SD, function(x) as.vector(scale(x))), by = sex, .SDcols= 2:190]
  • 非常感谢。 @akrun :)
猜你喜欢
  • 2013-05-09
  • 1970-01-01
  • 2013-11-19
  • 1970-01-01
  • 2018-10-12
  • 2021-02-18
  • 1970-01-01
  • 2020-03-15
  • 1970-01-01
相关资源
最近更新 更多