如何在 R 中对变量进行分组中心/标准化?

机器算法验证 r 标准化 定心
2022-03-01 05:05:39

我熟悉的功能包括base R的scale和 ARM 的rescale

也许最好的方法是使用 apply 的一些变体,指定一个或多个变量用作分组变量。

4个回答

这是一个可能的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))

基本上,第二个参数描述了如何“拆分”数据,第三个参数描述了对每个块应用什么函数。以上将x.std在data.frame中附加一个变量。x如果您想用缩放的变量替换原始变量,请使用。

group.center <- function(var,grp) {
    return(var-tapply(var,grp,mean,na.rm=T)[grp])
}

这是一个data.table解决方案。它绝对比 plyr 快(仅与大型数据集相关)。也许稍后我会做一个 dplyr 例子。

# generate example data
raw.data <- data.frame( outcome = c(rnorm(500, 100, 15), rnorm(500, 110, 12)), 
                        group = c(rep("a", 500), rep("b", 500)))

library(data.table)
# convert dataframe to data.table
raw.data <- data.table(raw.data, key = "group")

# create group standardized outcome variable
raw.data[ , group_std_outcome := (outcome - mean(outcome, na.rm = TRUE)) /  
           sd(outcome, na.rm = TRUE), "group"]

(是的,我重新发现了几年前我还是 R 菜鸟时提出的一个问题;)

您可以为此使用(除其他外)tapply(该plyr软件包包含许多其他选项,可能更适合您的特定情况):

tapply(variabletoscale, list(groupvar1, groupvar2), scale)