Як групувати в центрі / стандартизувати змінні в R?


9

Функції, які я знайомий, включають шкалу від базової R, масштаб масштабу від ARM.

Можливо, найкращим способом було б використовувати якийсь варіант застосунку, вказавши одну або кілька змінних, які слід використовувати як групуючі змінні.


Спробуйте: agregate (state.x77, list (Region = state.region, Cold = state.x77 [, "Frost"]> 130)), function (x) ((x - mean (x)) / sd (x) ))
suncoolsu

Відповіді:


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

В основному, другий аргумент описує, як "розділити" дані, 3-й аргумент, яку функцію застосувати до кожного фрагменту. Вищенаведене додасть змінну x.stdдо data.frame. Використовуйте, xякщо ви хочете замінити оригінальну змінну на масштабовану.



3

Ось рішення з таблицею даних . Це, безумовно, швидше, ніж 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

Ця відповідь - з білого паперу Махмуда Арая. Він має зручний побічний ефект маркування центрованих результатів з префіксом "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)))
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.