R에서 변수를 그룹 중심으로 / 표준화하는 방법은 무엇입니까?


9

익숙한 함수에는 기본 R의 배율 , ARM의 배율 조정이 포함 됩니다.

아마도 가장 좋은 방법은 그룹화 변수로 사용할 하나 이상의 변수를 지정하여 일부 변형 변형을 사용하는 것입니다.


시도 : 집합 (상태 .x77, 목록 (지역 = 상태. 지역, 콜드 = 상태 .x77 [, "냉각"]> 130)), 함수 (x) ((x-평균 (x)) / sd (x) ))
suncoolsu

답변:


7

가능한 플라이 솔루션입니다. 기본 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.stddata.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 noob 일 때 몇 년 전에 물었던 질문을 다시 발견했습니다.)


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

여기에 사용하여 업데이트 된 구현 dplyr 에서 tidyverse .

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)))
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.