Нормализовать по заданному стандартному отклонению от среднего значения каждого столбца (исключая первый) - PullRequest
0 голосов
/ 24 мая 2018

У меня есть набор данных ниже:

  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)

Ответы [ 3 ]

0 голосов
/ 24 мая 2018

Если у вас уже есть код, который делает то, что вам нужно, но изо всех сил пытаетесь применить его ко всем столбцам, кроме первого, попробуйте простой базовый подход 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)
0 голосов
/ 24 мая 2018

Будет ли это работать?

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% от него.

0 голосов
/ 24 мая 2018

Я надеюсь, что функция rescale поставляется из пакета scales.

Это типичный пример использования семейства функций * 1005. *
Я поработаю с копией данных и перемасштабирую копию, если вы не хотите сохранять оригиналИзменить код ниже очень просто.

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