Стандартизация столбцов данных в R



У меня есть набор данных с именем spam который содержит 58 столбцов и около 3500 строк данных, связанных со спам-сообщениями.



Я планирую запустить некоторую линейную регрессию на этом наборе данных в будущем, но я хотел бы сделать некоторую предварительную обработку заранее и стандартизировать столбцы, чтобы иметь нулевое среднее и единичную дисперсию.



Мне сказали, что лучший способ сделать это-с R, поэтому я хотел бы спросить как я могу достичь нормализации с помощью R? Я уже получил данные правильно загружены, и я просто ищу некоторые пакеты или методы для выполнения этой задачи.

819   12  

12 ответов:

Я должен предположить, что вы хотели сказать, что вы хотели среднее значение 0 и стандартное отклонение 1. Если ваши данные находятся в фрейме данных, и все столбцы являются числовыми, вы можете просто вызвать scale функция на данных, чтобы сделать то, что вы хотите.

dat <- data.frame(x = rnorm(10, 30, .2), y = runif(10, 3, 5))
scaled.dat <- scale(dat)

# check that we get mean of 0 and sd of 1
colMeans(scaled.dat)  # faster version of apply(scaled.dat, 2, mean)
apply(scaled.dat, 2, sd)

использование встроенных функций является классным. Как этот кот:

enter image description here

понимая, что вопрос старый и один ответ принят, я предоставлю другой ответ Для справки.

scale ограничивается тем, что он весы все переменные. Приведенное ниже решение позволяет масштабировать только определенные имена переменных, сохраняя другие переменные неизменными (и имена переменных могут быть динамически сгенерированы):

library(dplyr)

set.seed(1234)
dat <- data.frame(x = rnorm(10, 30, .2), 
                  y = runif(10, 3, 5),
                  z = runif(10, 10, 20))
dat

dat2 <- dat %>% mutate_each_(funs(scale(.) %>% as.vector), 
                             vars=c("y","z"))
dat2

что дает мне это:

> dat
          x        y        z
1  29.75859 3.633225 14.56091
2  30.05549 3.605387 12.65187
3  30.21689 3.318092 13.04672
4  29.53086 3.079992 15.07307
5  30.08582 3.437599 11.81096
6  30.10121 4.621197 17.59671
7  29.88505 4.051395 12.01248
8  29.89067 4.829316 12.58810
9  29.88711 4.662690 19.92150
10 29.82199 3.091541 18.07352

и

> dat2 <- dat %>% mutate_each_(funs(scale(.) %>% as.vector), 
>                              vars=c("y","z"))
> dat2
          x          y           z
1  29.75859 -0.3004815 -0.06016029
2  30.05549 -0.3423437 -0.72529604
3  30.21689 -0.7743696 -0.58772361
4  29.53086 -1.1324181  0.11828039
5  30.08582 -0.5946582 -1.01827752
6  30.10121  1.1852038  0.99754666
7  29.88505  0.3283513 -0.94806607
8  29.89067  1.4981677 -0.74751378
9  29.88711  1.2475998  1.80753470
10 29.82199 -1.1150515  1.16367556

EDIT: адресован комментарий Джулиана: выход scale матрица Nx1, поэтому в идеале мы должны добавить as.vector чтобы преобразовать тип матрицы обратно в векторный тип. Спасибо Джулиан!

Это 3 года. Тем не менее, я чувствую, что должен добавить следующее:

наиболее распространенной нормализацией является Z-преобразование, где вы вычитаете среднее и делите на стандартное отклонение вашей переменной. Результат будет иметь среднее значение=0 и sd=1.

для этого вам не нужен никакой пакет.

zVar <- (myVar - mean(myVar)) / sd(myVar)

вот и все.

пакет'Caret' предоставляет методы для предварительной обработки данных (например, центрирование и масштабирование). Вы также можете использовать следующий код:

library(caret)
# Assuming goal class is column 10
preObj <- preProcess(data[, -10], method=c("center", "scale"))
newData <- predict(preObj, data[, -10])

Подробнее:http://www.inside-r.org/node/86978

вы можете легко нормализовать данные также с помощью данных.Функция нормализации в пакете clusterSim. Он обеспечивает Различный метод нормализации данных.

    data.Normalization (x,type="n0",normalization="column")

Аргументы

x
вектор, матрица или набор данных типа
тип нормализации: ч0 - без нормализации

N1-стандартизация ((X-mean)/sd)

N2-позиционная стандартизация ((X-медиана)/mad)

Н3 - агрегатирования ((X-среднее)/диапазон)

n3a-позиционная унификация ((X-медиана)/диапазон)

N4-unitization с нулевым минимумом ((x-min)/диапазон)

N5-нормализация в диапазоне ((x-mean) / max (abs (x-mean)))

n5a-позиционная нормализация в диапазоне ((x-медиана)/max (abs (x-медиана)))

N6 - преобразование частных (x / sd)

n6a-преобразование позиционных частных (x / mad)

Н7 - коэффициент трансформации (х/диапазон)

N8 - преобразование частных (x / max)

N9-преобразование частных (x / mean)

n9a-преобразование позиционных частных (x / медиана)

N10-преобразование частных (x / sum)

N11 - преобразование частных (x / sqrt (SSQ))

12 до нормализации ((X-среднее)/корень(сумма((X-среднее)^2)))

n12a-позиционная нормализация ((X-медиана) / sqrt(sum((x-медиана)^2)))

13 до нормализации с нулем, являющимся центральной точкой ((x-midrange)/(range/2))

нормализация
"столбец" - нормализация по переменной," строка " - нормализация по объекту

когда я использовал решение, заявленное Dason, вместо того, чтобы получить фрейм данных в результате, я получил вектор чисел (масштабированные значения моего df).

в случае если кто-то испытывает те же проблемы, вы должны добавлять.данные.frame() к коду, например:

df.scaled <- as.data.frame(scale(df))

Я надеюсь, что это будет полезно для ppl, имеющих ту же проблему!

С dplyr v0.7. 4 все переменные можно масштабировать с помощью mutate_all():

library(dplyr)
#> 
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#> 
#>     filter, lag
#> The following objects are masked from 'package:base':
#> 
#>     intersect, setdiff, setequal, union
library(tibble)

set.seed(1234)
dat <- tibble(x = rnorm(10, 30, .2), 
              y = runif(10, 3, 5),
              z = runif(10, 10, 20))

dat %>% mutate_all(scale)
#> # A tibble: 10 x 3
#>         x      y       z
#>     <dbl>  <dbl>   <dbl>
#>  1 -0.827 -0.300 -0.0602
#>  2  0.663 -0.342 -0.725 
#>  3  1.47  -0.774 -0.588 
#>  4 -1.97  -1.13   0.118 
#>  5  0.816 -0.595 -1.02  
#>  6  0.893  1.19   0.998 
#>  7 -0.192  0.328 -0.948 
#>  8 -0.164  1.50  -0.748 
#>  9 -0.182  1.25   1.81  
#> 10 -0.509 -1.12   1.16

конкретные переменные могут быть исключены с помощью mutate_at():

dat %>% mutate_at(scale, .vars = vars(-x))
#> # A tibble: 10 x 3
#>        x      y       z
#>    <dbl>  <dbl>   <dbl>
#>  1  29.8 -0.300 -0.0602
#>  2  30.1 -0.342 -0.725 
#>  3  30.2 -0.774 -0.588 
#>  4  29.5 -1.13   0.118 
#>  5  30.1 -0.595 -1.02  
#>  6  30.1  1.19   0.998 
#>  7  29.9  0.328 -0.948 
#>  8  29.9  1.50  -0.748 
#>  9  29.9  1.25   1.81  
#> 10  29.8 -1.12   1.16

создан на 2018-04-24 по reprex package (версии v0.2.0).

опять же, хотя это старый вопрос, он очень актуален! И я нашел простой способ нормализовать некоторые столбцы без необходимости каких-либо пакетов:

normFunc <- function(x){(x-mean(x, na.rm = T))/sd(x, na.rm = T)}
x<-rnorm(10,14,2)
y<-rnorm(10,7,3)
z<-rnorm(10,18,5)
df<-data.frame(x,y,z)

df[2:3] <- apply(df[2:3], 2, normFunc)

вы увидите, что столбцы y и z были нормализованы. Никаких пакетов не требуется : -)

прежде чем я случайно нашел эту тему, у меня была та же проблема. У меня были зависимые от пользователя типы столбцов, поэтому я написал for цикл проходит через них и получать необходимые столбцы scale ' d. вероятно, есть лучшие способы сделать это, но это решило проблему просто отлично:

 for(i in 1:length(colnames(df))) {
        if(class(df[,i]) == "numeric" || class(df[,i]) == "integer") {
            df[,i] <- as.vector(scale(df[,i])) }
        }

as.vector это необходимая часть, потому что оказалось scale тут rownames x 1 матрица, которая обычно не то, что вы хотите иметь в вашем data.frame.

масштаб может использоваться как для полного фрейма данных, так и для конкретных столбцов. Для определенных столбцов, можно использовать следующий код:

trainingSet[, 3:7] = scale(trainingSet[, 3:7]) # For column 3 to 7
trainingSet[, 8] = scale(trainingSet[, 8]) # For column 8 

полный кадр данных

trainingSet <- scale(trainingSet)

используйте пакет "recommenderlab". Загрузите и установите пакет. Этот пакет имеет команду "нормализовать" в построенном виде. Он также позволяет выбрать один из многих методов нормализации, а именно "центр" или "Z-оценка" Выполните следующий пример:

## create a matrix with ratings
m <- matrix(sample(c(NA,0:5),50, replace=TRUE, prob=c(.5,rep(.5/6,6))),nrow=5, ncol=10, dimnames = list(users=paste('u', 1:5, sep=&rdquo;), items=paste('i', 1:10, sep=&rdquo;)))

## do normalization
r <- as(m, "realRatingMatrix")
#here, 'centre' is the default method
r_n1 <- normalize(r) 
#here "Z-score" is the used method used
r_n2 <- normalize(r, method="Z-score")

r
r_n1
r_n2

## show normalized data
image(r, main="Raw Data")
image(r_n1, main="Centered")
image(r_n2, main="Z-Score Normalization")

The есть две функции, которые делают это.

> require(dplyr)

мутировать конкретные столбцы таблицы данных, вы можете использовать функцию mutate_at(). Мутировать все столбцы, вы можете использовать mutate_all.

ниже приводится пример использования этих функций для стандартизации данных.

мутировать определенные столбцы:

dt = data.table(a = runif(3500), b = runif(3500), c = runif(3500))
dt = data.table(dt %>% mutate_at(vars("a", "c"), scale)) # can also index columns by number, e.g., vars(c(1,3))

> apply(dt, 2, mean)
            a             b             c 
 1.783137e-16  5.064855e-01 -5.245395e-17 

> apply(dt, 2, sd)
        a         b         c 
1.0000000 0.2906622 1.0000000 

мутировать все столбцы:

dt = data.table(a = runif(3500), b = runif(3500), c = runif(3500))
dt = data.table(dt %>% mutate_all(scale))

> apply(dt, 2, mean)
            a             b             c 
-1.728266e-16  9.291994e-17  1.683551e-16 

> apply(dt, 2, sd)
a b c 
1 1 1 

Comments

    Ничего не найдено.