【问题标题】:R quirk: Normalize the content of a vector by binned values of another vectorR quirk:通过另一个向量的分箱值来规范化向量的内容
【发布时间】:2014-02-09 04:44:02
【问题描述】:

我在 R 中有一个小问题:

假设我有一个包含两列的数据框,一列包含频率,一列包含分数。我怀疑分数的方差取决于频率。所以我想通过分箱频率将我的分数标准化为 mean=0 和 var=1。

例如,假设我想要 10 个垃圾箱。首先,每个分数都会被分配一个 bin,然后在该 bin 内,每个分数都将通过该 bin 中所有分数的均值和方差进行归一化。

结果应该是具有标准化值的第三列

使用bins = cut(frequencies, b=bins, 1:bins) 将数据分箱很容易,但是我还没有找到从那里继续的方法。

提前致谢!

【问题讨论】:

    标签: r dataframe normalization


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-18
      • 2020-03-18
      • 2010-12-22
      • 2022-01-24
      相关资源
      最近更新 更多