R quirk:通过另一个向量的分箱值来规范化向量的内容
Posted
技术标签:
【中文标题】R quirk:通过另一个向量的分箱值来规范化向量的内容【英文标题】:R quirk: Normalize the content of a vector by binned values of another vector 【发布时间】:2014-02-09 04:44:02 【问题描述】:我在 R 中有一个小问题:
假设我有一个包含两列的数据框,一列包含频率,一列包含分数。我怀疑分数的方差取决于频率。所以我想通过分箱频率将我的分数标准化为 mean=0 和 var=1。
例如,假设我想要 10 个垃圾箱。首先,每个分数都会被分配一个 bin,然后在该 bin 内,每个分数都将通过该 bin 中所有分数的均值和方差进行归一化。
结果应该是具有标准化值的第三列
使用bins = cut(frequencies, b=bins, 1:bins)
将数据分箱很容易,但是我还没有找到从那里继续的方法。
提前致谢!
【问题讨论】:
【参考方案1】:scale
在归一化为 mean=0, sd=1 和 if 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)
现在在每个bins
中使用ave
到scale
和scores
:
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
在每个 bin 中为 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
【讨论】:
以上是关于R quirk:通过另一个向量的分箱值来规范化向量的内容的主要内容,如果未能解决你的问题,请参考以下文章