У меня есть набор данных, spam
который называется 58 столбцов и около 3500 строк данных, связанных со спам-сообщениями.
Я планирую запустить некоторую линейную регрессию для этого набора данных в будущем, но я хотел бы сделать некоторую предварительную обработку заранее и стандартизировать столбцы, чтобы иметь нулевое среднее значение и единичную дисперсию.
Мне сказали, что лучший способ это сделать с помощью R, поэтому я хотел бы спросить, как мне добиться нормализации с помощью R ? Я уже правильно загрузил данные и просто ищу пакеты или методы для выполнения этой задачи.
источник
Понимая, что вопрос старый и один ответ принят, я предоставлю другой для справки.
scale
ограничен тем, что он масштабирует все переменные . Приведенное ниже решение позволяет масштабировать только определенные имена переменных, сохраняя другие переменные без изменений (и имена переменных могут генерироваться динамически):что дает мне это:
и
РЕДАКТИРОВАТЬ 1 (2016) : Адресовано замечание Джулиана: вывод
scale
- матрица Nx1, поэтому в идеале мы должны добавить,as.vector
чтобы преобразовать тип матрицы обратно в векторный тип. Спасибо, Джулиан!РЕДАКТИРОВАТЬ 2 (2019) : Цитировать комментарий Дуччо А.: Для последней версии dplyr (версия 0.8) вам нужно изменить dplyr :: funcs со списком, например
dat %>% mutate_each_(list(~scale(.) %>% as.vector), vars=c("y","z"))
РЕДАКТИРОВАТЬ 3 (2020) : Благодаря @mj_whales: старое решение устарело, и теперь мы должны использовать
mutate_at
.источник
f(g(x))
было бы лучше, если бы кто-то писалx %>% g %>% f
. Другими словами,dat %>% mutate_each_(funs(scale),vars=c("y","z"))
это простоmutate_each_(dat,funs(scale),vars=c("y","z"))
. Оператор очень помогает, когда цепочка очень длинная, потому чтоf(g(h(i(j(x)))))
ее очень трудно читать.dplyr
(версии 0.8) , вам необходимо изменитьdplyr::funcs
сlist
, какdat %>% mutate_each_(list(~scale(.) %>% as.vector), vars=c("y","z"))
mutate_each_()
сейчас устарела. Вы можете использоватьmutate_at()
вместо этого. Новый способ сделать это будет:dat2 <- dat %>% mutate_at(c("y", "z"), scale)
Это 3 года. Тем не менее, я чувствую, что должен добавить следующее:
Наиболее распространенной нормализацией является z-преобразование , где вы вычитаете среднее значение и делите на стандартное отклонение вашей переменной. Результат будет иметь среднее значение = 0 и SD = 1.
Для этого вам не нужен пакет.
Вот и все.
источник
mutate(var = (var - mean(var))/sd(var))
.myVar <- (zVar * sd(zVar)) + mean(zVar)
, верно?newVar <- (zVar * sd(myVar)) + mean(myVar)
. Вы должны использовать оригинальное среднее / SD. Как вы уже написали, выsd(zVar)=1
mean(zVar)=0
Пакет 'Caret' предоставляет методы для предварительной обработки данных (например, центрирование и масштабирование). Вы также можете использовать следующий код:
Более подробная информация: http://www.inside-r.org/node/86978
источник
Когда я использовал решение, сформулированное Дэйсоном, вместо того, чтобы в результате получить фрейм данных, я получил вектор чисел (масштабированные значения моего df).
Если у кого-то возникла такая же проблема, вы должны добавить as.data.frame () в код, например:
Я надеюсь, что это будет полезно для людей, имеющих такую же проблему!
источник
train_dt[-24] <- scale(train_dt[-24])
где «24» - номер столбца, который нужно исключитьВы можете легко нормализовать данные, также используя функцию data.Normalization в кластере clusterSim. Это обеспечивает другой метод нормализации данных.
аргументы
тип нормализации x,
вектор, матрица или тип набора данных
: n0 - без нормализации
n1 - стандартизация ((х-среднее) / SD)
n2 - позиционная стандартизация ((х-медиана) / безумная)
n3 - единица измерения ((среднее значение по х) / диапазон)
n3a - позиционная унификация ((х-медиана) / диапазон)
n4 - унификация с нулевым минимумом ((x-min) / диапазон)
n5 - нормализация в диапазоне <-1,1> ((среднее значение x) / максимальное значение (среднее значение x)))
n5a - позиционная нормализация в диапазоне <-1,1> ((х-медиана) / макс (абс (х-медиана)))
n6 - коэффициент преобразования (х / сд)
n6a - позиционное коэффициентное преобразование (x / mad)
n7 - коэффициент преобразования (х / диапазон)
n8 - коэффициент преобразования (х / макс)
n9 - коэффициент преобразования (х / среднее)
n9a - позиционное коэффициентное преобразование (х / медиана)
n10 - коэффициент преобразования (х / сумма)
n11 - коэффициент преобразования (x / sqrt (SSQ))
n12 - нормализация ((x-среднее) / sqrt (сумма ((x-среднее) ^ 2)))
n12a - позиционная нормализация ((x-медиана) / sqrt (сумма ((x-медиана) ^ 2)))
n13 - нормализация с нулем, являющимся центральной точкой ((x-midrange) / (range / 2))
нормализация
"столбец" - нормализация по переменной, "строка" - нормализация по объекту
источник
В
dplyr
версии 0.7.4 все переменные можно масштабировать с помощьюmutate_all()
:Конкретные переменные могут быть исключены с помощью
mutate_at()
:Создано в 2018-04-24 пакетом представлением (v0.2.0).
источник
Опять же, хотя это старый вопрос, он очень актуален! И я нашел простой способ нормализовать определенные столбцы без необходимости каких-либо пакетов:
Например
Вы увидите, что столбцы y и z нормализованы. Пакеты не нужны :-)
источник
Шкала может использоваться как для полного кадра данных, так и для конкретных столбцов. Для определенных столбцов можно использовать следующий код:
Полный кадр данных
источник
dplyr
Пакет имеет две функции , которые делают это.Чтобы изменить определенные столбцы таблицы данных, вы можете использовать функцию
mutate_at()
. Чтобы изменить все столбцы, вы можете использоватьmutate_all
.Ниже приведен краткий пример использования этих функций для стандартизации данных.
Мутируйте определенные столбцы:
Мутировать все столбцы:
источник
До того, как мне удалось найти эту ветку, у меня была такая же проблема. У меня были зависимые от пользователя типы столбцов, поэтому я написал
for
цикл, просматривая их и получая необходимые столбцыscale
d. Возможно, есть лучшие способы сделать это, но это решило проблему просто отлично:as.vector
это необходимая часть, потому что оказалось,scale
чтоrownames x 1
матрица, которая обычно не то, что вы хотите иметь в своемdata.frame
.источник
Используйте пакет "Recommenderlab". Загрузите и установите пакет. Этот пакет имеет команду «Нормализовать» во встроенном. Это также позволяет вам выбрать один из многих методов нормализации, а именно «центр» или «Z-счет». Следуйте следующему примеру:
источник
Функция нормализации из пакета BBMisc была для меня подходящим инструментом, поскольку она может работать со значениями NA.
Вот как это использовать:
Учитывая следующий набор данных,
Нормированные значения можно получить так:
где ручной расчетный метод просто игнорирует колмуны, содержащие НК:
(нормализован человек, составлен список НС ...)
Что касается выбора конкретных столбцов для расчета, можно использовать общий метод, например, такой:
источник
@BBKim в значительной степени дал лучший ответ, но это можно сделать короче. Я удивлен, что никто еще не придумал это.
dat <- data.frame(x = rnorm(10, 30, .2), y = runif(10, 3, 5)) dat <- apply(dat, 2, function(x) (x - mean(x)) / sd(x))
источник