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


9

我熟悉的功能包括R的缩放比例和ARM的缩放比例

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


试试:aggregate(state.x77,列表(Region = state.region,Cold = state.x77 [,“ Frost”]> 130)),函数(x)((x-mean(x))/ sd(x) ))
suncoolsu 2011年

Answers:


7

这是一个可能的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,如果你想通过缩放来替换原来的变量。


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

3

这是一个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新手时问的一个问题;)


2

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

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

1
有两个因素,它将不会返回data.frame。您需要对此进行后处理。
chl

0

这个答案来自Mahmood Arai的白皮书。用居中前缀“ C”标记居中结果具有便利的副作用:

gcenter <- function(df1,group) {
        variables <- paste(
              rep("C", ncol(df1)),  colnames(df1), sep=".")
        copydf <- df1
        for (i in 1:ncol(df1)) {
              copydf[,i] <- df1[,i] - ave(df1[,i], group, FUN=mean)}
        colnames(copydf) <- variables
        return(cbind(df1,copydf))}

0

这是使用tidyversedplyr的更新实现。

library(tidyverse)

my.df <- data.frame(x=rnorm(100, mean=10), sex=sample(c("M","F"), 100, rep=T))
my.df <- group_by(my.df, sex) %>% mutate(x.sd = as.numeric(scale(x)))
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.