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 中使用avescalescores

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:通过另一个向量的分箱值来规范化向量的内容的主要内容,如果未能解决你的问题,请参考以下文章

如何在 R 中绘制预分箱直方图

使用`scipy.stats.binned_statistic`标准化分箱值的标准偏差

使用分箱 X 值 Python 制作条形图

如何标准化r中的向量[重复]

20-余弦相似度及其R实现

将向量的每个元素与 R 中的另一个向量组合