【问题标题】:Normalize by set standard deviation from mean of every column (excluding first)通过设置每列平均值的标准偏差进行归一化(不包括第一列)
【发布时间】:2018-11-04 01:41:42
【问题描述】:

我在下面有一个数据集:

  A       B     C      D
500       2     4      6
501       6     8     45
502       4     7      9 

如何对除第一个要标准化的列之外的每一列进行标准化,并与每列的平均值设置标准偏差。

例如下面是每列的方法:

B = 4
C = 6.333
D = 20

然后我想用不大于任一方向平均值的 25% 的边界进行归一化。

我认为您可以通过重新缩放来做到这一点,但我只是不知道如何将其应用于所有列:

library(scales)
rescale(x, to = c(mean - 0.25*mean, mean + 0.25*mean)

我知道这是一种方法,但它没有考虑到界限和 25% 的标准差集:

normalized <- function(x){
  return((x-min(x)) / (max(x)-min(x)))
}

normalized_dataset<-df %>% 
  mutate_at(vars(-one_of("A")), normalized)

【问题讨论】:

  • 我不知道如何计算,但我想用新的标准化值替换除第一列之外的当前列。
  • 您能否确认您说的是scales::rescale,并将库调用添加到您的问题中?
  • 是的,指的是scales包。刚刚添加了,谢谢

标签: r scale normalize rescale


【解决方案1】:

我希望函数rescale 来自包scales

这是使用*apply 系列函数的典型示例。
我将处理数据的副本并重新缩放副本,如果您不想保留原始数据,只需修改以下代码即可。

dat2 <- dat

dat2[-1] <- lapply(dat2[-1], function(x)
    scales::rescale(x, to = c(mean(x) - 0.25*mean(x), mean(x) + 0.25*mean(x))))

dat2
#    A B        C        D
#1 500 3 4.750000 15.00000
#2 501 5 7.916667 25.00000
#3 502 4 7.125000 15.76923

数据。

dat <- read.table(text = "
  A       B     C      D
500       2     4      6
501       6     8     45
502       4     7      9 
", header = TRUE)

【讨论】:

  • 也许这是 OP 想要的,但是您的列不再具有相同的平均值,如果平均值不重要,为什么要使用它来设置数据范围?
  • @Moody_Mudskipper 我不知道,这对 OP 来说是个好问题。
【解决方案2】:

如果您已经有代码可以满足您的需要,但难以将其应用于除第一列之外的所有列,请尝试使用简单的基本 R 方法。

你的功能:

## your rescale function
fun1 <- function(x){
    return(  scales::rescale(x, to = c(mean(x) - 0.25*mean(x), mean(x) + 0.25*mean(x))))
}

应用于除第一列之外的所有列:

dat[2:4] <- lapply(dat[2:4], fun1)

【讨论】:

    【解决方案3】:

    这行得通吗?

    df <- read.table(text="
      A       B     C      D
    500       2     4      6
    501       6     8     45
    502       4     7      9",h=T)
    
    df2 <- df
    df2[-1] <- lapply(df[-1],function(x) mean(x) +(x-mean(x)) * 0.25*mean(x)/max(abs(x-mean(x))))
    
    #     A B        C    D
    # 1 500 3 4.750000 17.2
    # 2 501 5 7.464286 25.0
    # 3 502 4 6.785714 17.8
    

    每个相关列的平均值保持不变,但值会重新调整,以便距平均值最远的值与它的距离为mean*25%

    【讨论】:

    • 对不起,这实际上可以应用于前两列吗?
    • 这看起来不错,只需要跳过前两个而不是第一个
    • 你必须输入 [-(1:2)] 而不是 [-1] :df2[-(1:2)] &lt;- lapply(df[-(1:2)] ...
    猜你喜欢
    • 2021-12-11
    • 2021-03-06
    • 2021-07-08
    • 2020-07-22
    • 1970-01-01
    • 2015-03-05
    • 2016-07-28
    • 2014-10-11
    • 2019-07-19
    相关资源
    最近更新 更多