R'deki değişkenler nasıl gruplanır / standartlaştırılır?


9

Bildiğim işlevler taban R'den ölçek , ARM'den yeniden ölçeklendirmeyi içerir .

Belki de en iyi yol, gruplama değişkenleri olarak kullanılacak bir veya daha fazla değişkeni belirterek bazı uygulama değişkenlerini kullanmak olabilir.


Deneyin: toplama (durum.x77, liste (Bölge = durum. bölge, Soğuk = durum.x77 [, "Don"]> 130)), işlev (x) ((x - ortalama (x)) / sd (x) ))
suncoolsu

Yanıtlar:


7

İşte olası bir plyr çözümü. Temel transform()fonksiyona dayandığını unutmayı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))

(Beklendiği gibi çalışıp çalışmadığını kontrol edebiliriz, ör., with(subset(my.df, sex=="F" & group=="A"), scale(x)))

Temel olarak, 2. argüman verilerin nasıl "bölüneceğini", 3. argüman ise her bir parçaya hangi fonksiyonun uygulanacağını açıklar. Yukarıdaki x.stdveriler data.frame öğesine bir değişken ekleyecektir . xOrijinal değişkeninizi ölçeklendirilmiş değişkenle değiştirmek istiyorsanız kullanın .


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

3

İşte bir data.table çözümü. Kesinlikle plyr'den daha hızlıdır (sadece büyük veri kümeleri için geçerlidir). Belki daha sonra bir dplyr örneği yapacağım.

# 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"]

(Evet, yıllar önce R noob olduğumda sorduğum bir soruyu yeniden keşfettim;)


2

Sen (diğerleri arasında) kullanabilir tapply(bunun için plyrpaket daha iyi özel durum için uygun olabilecek diğer seçenekleri çok içerir):

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

1
İki faktörle birlikte bir data.frame döndürmez. Bunun için sonucu sonradan işlemeniz gerekir.
chl

0

Bu cevap Mahmood Arai'nin beyaz kitabından. Ortalanmış sonuçları "C" ön ekiyle etiketlemenin uygun yan etkisi vardır:

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

İşte kullanarak güncellenmiş uygulamasıdır dplyr gelen 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)))
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.