Làm thế nào để nhóm trung tâm / tiêu chuẩn hóa các biến trong R?


9

Chức năng Tôi quen thuộc với bao gồm quy mô từ cơ sở R, rescale từ ARM.

Có lẽ cách tốt nhất là sử dụng một số biến thể của ứng dụng, chỉ định một hoặc nhiều biến để sử dụng làm nhóm biến.


Hãy thử: tổng hợp (state.x77, list (Region = state.region, Cold = state.x77 [, "Frost"]> 130)), hàm (x) ((x - mean (x)) / sd (x) ))
suncoolsu

Câu trả lời:


7

Đây là một giải pháp plyr có thể . Lưu ý rằng nó dựa vào transform()chức năng cơ bản .

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))

(Chúng tôi có thể kiểm tra xem nó có hoạt động như mong đợi không, vd, with(subset(my.df, sex=="F" & group=="A"), scale(x)))

Về cơ bản, đối số thứ 2 mô tả cách "phân tách" dữ liệu, đối số thứ 3 sẽ áp dụng chức năng nào cho mỗi khối. Ở trên sẽ nối một biến x.stdvào data.frame. Sử dụng xnếu bạn muốn thay thế biến ban đầu của mình bằng biến được chia tỷ lệ.


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

3

Đây là một giải pháp data.table . Nó chắc chắn nhanh hơn plyr (chỉ liên quan đến các tập dữ liệu lớn). Có lẽ sau này tôi sẽ làm một ví dụ 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"]

(Vâng, tôi đã khám phá lại một câu hỏi tôi đã hỏi nhiều năm trước khi tôi còn là một N noob;)


2

Bạn có thể sử dụng (trong số những thứ khác) tapplycho việc này ( plyrgói chứa nhiều tùy chọn khác có thể phù hợp hơn với tình huống cụ thể của bạn):

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

1
Với hai yếu tố, nó sẽ không trả về data.frame. Bạn sẽ cần xử lý hậu quả cho việc đó.
chl

0

Câu trả lời này là từ một tờ giấy trắng của Mahmood Arai. Nó có tác dụng phụ thuận tiện là ghi nhãn các kết quả chính giữa với tiền tố "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

Đây là một triển khai được cập nhật bằng cách sử dụng dplyr từ 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)))
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.