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.
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.
Câu trả lời:
Đâ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.std
vào data.frame. Sử dụng x
nếu bạn muốn thay thế biến ban đầu của mình bằng biến được chia tỷ lệ.
Đâ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;)
Bạn có thể sử dụng (trong số những thứ khác) tapply
cho việc này ( plyr
gó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)
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))}
Đâ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)))