Стандартизация столбцов данных в R
У меня есть набор данных с именем spam который содержит 58 столбцов и около 3500 строк данных, связанных со спам-сообщениями.
Я планирую запустить некоторую линейную регрессию на этом наборе данных в будущем, но я хотел бы сделать некоторую предварительную обработку заранее и стандартизировать столбцы, чтобы иметь нулевое среднее и единичную дисперсию.
Мне сказали, что лучший способ сделать это-с R, поэтому я хотел бы спросить как я могу достичь нормализации с помощью R? Я уже получил данные правильно загружены, и я просто ищу некоторые пакеты или методы для выполнения этой задачи.
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)использование встроенных функций является классным. Как этот кот:
понимая, что вопрос старый и один ответ принят, я предоставлю другой ответ Для справки.
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.16367556EDIT: адресован комментарий Джулиана: выход
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, имеющих ту же проблему!
С
dplyrv0.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=”), items=paste('i', 1:10, sep=”))) ## 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