Fungsi Aku akrab dengan menyertakan skala dari basis R, rescale dari ARM.
Mungkin cara terbaik adalah menggunakan beberapa varian berlaku, menentukan satu atau lebih variabel untuk digunakan sebagai variabel pengelompokan.
Fungsi Aku akrab dengan menyertakan skala dari basis R, rescale dari ARM.
Mungkin cara terbaik adalah menggunakan beberapa varian berlaku, menentukan satu atau lebih variabel untuk digunakan sebagai variabel pengelompokan.
Jawaban:
Berikut adalah solusi plyr yang mungkin . Perhatikan bahwa ini bergantung pada transform()
fungsi dasar .
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))
(Kita dapat memeriksa apakah itu berfungsi seperti yang diharapkan dengan misalnya, with(subset(my.df, sex=="F" & group=="A"), scale(x))
)
Pada dasarnya, argumen ke-2 menjelaskan bagaimana cara "membagi" data, argumen ke-3 apa fungsi yang berlaku untuk setiap chunk. Di atas akan menambahkan variabel x.std
ke data.frame. Gunakan x
jika Anda ingin mengganti variabel asli Anda dengan yang diskalakan.
Berikut ini adalah solusi data.table . Ini jelas lebih cepat dari plyr (hanya relevan untuk set data besar). Mungkin nanti saya akan membuat contoh 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"]
(Ya, saya menemukan kembali pertanyaan yang saya tanyakan bertahun-tahun yang lalu ketika saya masih kecil;)
Anda dapat menggunakan (antara lain) tapply
untuk ini ( plyr
paket berisi banyak opsi lain yang mungkin lebih cocok untuk situasi spesifik Anda):
tapply(variabletoscale, list(groupvar1, groupvar2), scale)
Jawaban ini dari kertas putih oleh Mahmood Arai. Ini memiliki efek samping yang nyaman dengan memberi label hasil yang terpusat dengan awalan "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))}
Berikut ini adalah implementasi yang diperbarui menggunakan dplyr dari 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)))