कार्य मैं से परिचित हूँ शामिल पैमाने आधार आर, से rescale एआरएम से।
शायद सबसे अच्छा तरीका समूह के चर के रूप में उपयोग करने के लिए एक या एक से अधिक चर निर्दिष्ट करते हुए, लागू के कुछ प्रकार का उपयोग करना होगा।
कार्य मैं से परिचित हूँ शामिल पैमाने आधार आर, से rescale एआरएम से।
शायद सबसे अच्छा तरीका समूह के चर के रूप में उपयोग करने के लिए एक या एक से अधिक चर निर्दिष्ट करते हुए, लागू के कुछ प्रकार का उपयोग करना होगा।
जवाबों:
यहाँ एक संभावित प्लायर समाधान है। ध्यान दें कि यह आधार 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))
)
मूल रूप से, 2 तर्क बताता है कि डेटा को "विभाजित" कैसे किया जाए, 3 तर्क प्रत्येक चंक पर लागू करने के लिए क्या कार्य करता है। उपरोक्त x.std
डेटा के लिए एक चर संलग्न करेगा । x
यदि आप अपने मूल चर को स्केल किए गए एक से बदलना चाहते हैं तो उपयोग करें ।
यहाँ एक डेटा है। समाधान। यह निश्चित रूप से प्लाई से तेज है (केवल बड़े डेटा सेट के लिए प्रासंगिक है)। हो सकता है कि बाद में मैं इसका उदाहरण दूंगा।
# 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"]
(हां, मैंने एक सवाल पूछा था जो मैंने सालों पहले पूछा था जब मैं एक आर नोब था;)
आप (दूसरों के बीच) का उपयोग कर सकते tapply
इस लिए ( plyr
पैकेज अन्य विकल्प है कि बेहतर अपने विशिष्ट स्थिति के लिए अनुकूल हो सकता है की बहुत सारी शामिल हैं):
tapply(variabletoscale, list(groupvar1, groupvar2), scale)
यह उत्तर महमूद अरी द्वारा एक श्वेत पत्र से है। इसमें उपसर्ग "सी" के साथ केंद्रित परिणामों को लेबल करने का सुविधाजनक पक्ष प्रभाव है:
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))}
यहाँ tidyverse से dplyr का उपयोग करके एक अद्यतन कार्यान्वयन है ।
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)))