1

我在下面有一个数据集:

  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)
4

3 回答 3

1

我希望功能rescale来自 package 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)
于 2018-05-24T18:43:49.913 回答
1

如果您已经有代码可以满足您的需要,但难以将其应用于除第一列之外的所有列,请尝试使用简单的基本 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)
于 2018-05-24T18:43:50.493 回答
1

这行得通吗?

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%与其相距一定距离。

于 2018-05-24T18:43:58.500 回答