Масштабирование данных в R дает ложную ошибку "длина" центра "должна равняться количеству столбцов "x""
Я пытаюсь масштабировать данные.кадр в диапазоне 0 и 1 с использованием следующего кода:
for(i in 1:nrow(data))
{
x <- data[i, ]
data[i, ] <- scale(x, min(x), max(x)-min(x))
}
Data:
x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 x13 x14 x15 x16 x17
15 6 6 0 9 3 1 4 5 1 1 13 0 0 20 5 28
2 24 14 7 0 15 7 0 11 3 3 4 15 7 0 30 0 344
3 10 5 2 0 6 2 0 5 0 0 2 7 1 0 11 0 399
4 9 4 2 0 5 2 0 4 0 0 2 6 1 0 10 0 28
5 6 2 1 0 3 1 0 2 0 0 1 3 1 0 6 0 82
6 9 4 2 0 5 2 0 4 0 0 2 6 1 0 10 0 42
, но я получаю следующее сообщение об ошибке:
Error in scale.default(x, min(x), max(x) - min(x)) (from #4) :
length of 'center' must equal the number of columns of 'x'
3 ответов
используя эти данные , ваш пример работает для меня:
data <- matrix(sample(1:1000,17*6), ncol=17,nrow=6)
for(i in 1:nrow(data)){
x <- data[i, ]
data[i, ] <- scale(x, min(x), max(x)-min(x))
}
здесь другой вариант с использованием масштаба, без цикла. Вам нужно просто предоставить scale
и a center
С теми же столбцами, что и ваша матрица.
maxs <- apply(data, 2, max)
mins <- apply(data, 2, min)
scale(data, center = mins, scale = maxs - mins)
редактировать как получить доступ к результату.
шкала возвращает матрицу с 2 атрибутами. Чтобы получить данные.фрейм, вам нужно просто принудить результат масштаба к данным.рамка.
dat.scale <- scale(data, center = mins, scale = maxs - mins)
dat.sacle <- as.data.frame(dat.scale)
на center
и scale
аргументы scale
должны иметь длину, равную количеству столбцов в x
. Похоже на data
это data.frame
, так как x
имеет столько столбцов, сколько ваш data.frame
и, следовательно, конфликт. Вы можете пройти эту загвоздку тремя способами:
- падение подряд в атомный вектор до
scale
(который будет рассматривать его как один столбец):scale(as.numeric(x), ...)
- преобразование
data
наmatrix
, который выпадает подряд извлечение в атомарные векторы автоматически. - использовать @agstudy это
apply
предложение, которое будет работать, будь тоdata.frame
илиmatrix
и, возможно, это" правильный " способ сделать это в R.
существует и другой способ масштабирования данных путем создания функции
data_norm<- function(x) {((x-min(x))/(max(x)-min(x)))}
variables_norm<- as.data.frame(lapply(data[1:17], data_norm))
summary(variables_norm)