Масштабирование данных в 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)
