2014-01-20 3 views
2

У меня есть небольшая проблема в R:R галтель: Нормализация содержания вектора Binned значений другого вектора

что у меня есть dataframe с двумя колоннами, одна из которых содержат один частот и содержащей оценку. Я подозреваю, что дисперсия баллов зависит от частоты. Поэтому я хочу нормализовать свои баллы по частоте бит, чтобы иметь среднее значение = 0 и var = 1.

Например, допустим, что я хочу 10 бункеров. Сначала каждому счету присваивается бит, а затем в пределах этого бина каждый балл будет нормализован по среднему значению и дисперсии всех баллов в этом бункере.

Результат должен быть третий столбец с нормированными значениями

Получение данных Binned легко, используя bins = cut(frequencies, b=bins, 1:bins), однако я не нашел способ оттуда.

Заранее благодарен!

ответ

2

scale Ваш друг здесь в терминах нормализации к среднему значению = 0, sd = 1, и если sd = 1, var = 1.

> mean(scale(1:10)) 
[1] 0 
> sd(scale(1:10)) 
[1] 1 
> var(scale(1:10)) 
    [,1] 
[1,] 1 

Попробуйте пример данных:

set.seed(42) 
dat <- data.frame(freq=sample(1:100), scores=rnorm(100, mean=4, sd=2)) 
dat$bins <- cut(dat$freq, breaks=c(0, 1:10*10), include.lowest=TRUE) 

Теперь использовать ave для scale в scores в каждой из bins:

dat$scaled <- with(dat,ave(scores,bins,FUN=scale)) 

Вы можете проверить результаты с aggregate или аналогичные:

mean равен 0 (или очень близко к ошибке округления) в каждом бункере.

> aggregate(scaled ~ bins, data=dat, FUN=function(x) round(mean(x), 2)) 
     bins scaled 
1 [0,10]  0 
2 (10,20]  0 
3 (20,30]  0 
4 (30,40]  0 
5 (40,50]  0 
6 (50,60]  0 
7 (60,70]  0 
8 (70,80]  0 
9 (80,90]  0 
10 (90,100]  0 

sd 1 в каждом бункере:

> aggregate(scaled ~ bins, data=dat, FUN=sd) 
     bins scaled 
1 [0,10]  1 
2 (10,20]  1 
3 (20,30]  1 
4 (30,40]  1 
5 (40,50]  1 
6 (50,60]  1 
7 (60,70]  1 
8 (70,80]  1 
9 (80,90]  1 
10 (90,100]  1 
+0

Это один лайнер прекрасно работает! – Misconstruction

Смежные вопросы