2013-12-23 3 views
2

Я очень благодарен за вашу помощь в этом вопросе. У меня есть следующий набор данных, и я бы хотел создать новую переменную, которая будет содержать стандартизированные значения (z-распределение) на уровень данной фактор-переменной.Как стандартизировать переменную на основе уровней факторов и создать новую переменную в R

x<-data.frame(gender=c("boy","boy","boy","girl","girl","girl"),values=c(1,2,3,6,7,8)) 
x 
> x  
    gender values 
1 boy  1 
2 boy  2 
3 boy  3 
4 girl  6 
5 girl  7 
6 girl  8 

Моя цель состоит в том, чтобы создать одну новую переменную, которая будет содержать Z-значения, рассчитанные отдельно для каждого уровня фактора (для мальчиков и для девочек).

И еще один вопрос. В основном я хотел бы создать переменную с z-значениями. Было бы аналогичным, если бы я хотел применить другую функцию и, например, вычислить распределение в квантилях на факторный уровень?

Благодарим за помощь!

ответ

2

Вы можете использовать scale с ave и transform:

> transform(x, z_score=ave(values, gender, FUN=scale)) 
    gender values z_score 
1 boy  1  -1 
2 boy  2  0 
3 boy  3  1 
4 girl  6  -1 
5 girl  7  0 
6 girl  8  1 

aggregate также полезен

> aggregate(values ~ gender, scale, data=x) 

И есть много способов, с помощью ddply из plyr, tapply, data.table. Взгляните на this post

+1

Вам не нужно '' with' внутри transform'. –

0

Вопрос о том, как создать z, уже был дан ответ.

Вот способ расчета квантили для каждого уровня фактора:

with(x, tapply(values, gender, FUN = quantile)) 
# $boy 
# 0% 25% 50% 75% 100% 
# 1.0 1.5 2.0 2.5 3.0 
# 
# $girl 
# 0% 25% 50% 75% 100% 
# 6.0 6.5 7.0 7.5 8.0 
Смежные вопросы