通过设置与每列平均值的标准偏差进行归一化(不包括第一列)
Normalize by set standard deviation from mean of every column (excluding first)
我有以下数据集:
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)
我希望函数 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)
如果您已经拥有满足您需要的代码,但很难将其应用于除第一列以外的所有列,请尝试使用简单的基本 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)
这行得通吗?
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%
。
我有以下数据集:
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)
我希望函数 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)
如果您已经拥有满足您需要的代码,但很难将其应用于除第一列以外的所有列,请尝试使用简单的基本 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)
这行得通吗?
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%
。