2014-01-20 38 views
2

的装箱值规格化的矢量的内容我有R中的一个小问题:ř怪癖:由另一矢量

说我有具有两列,一个包含频率和一种含一个得分数据帧。我怀疑分数的差异取决于频率。所以我想通过binned频率来标准化我的分数,使mean = 0和var = 1。

例如,假设我想要10个垃圾箱。首先将每个分数分配一个分箱,然后在该分箱内,每个分数将通过该分箱中所有分数的平均值和方差标准化。

结果应与标准值

第三列分级获取数据是很容易,使用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) 

现在使用avescalescores在每个bins的:

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

您可以检查结果与aggregate或类似:

mean在每个bin中为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