6

我正在尝试使用以下代码在 0 和 1 范围内缩放 data.frame:

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'
4

3 回答 3

8

使用此数据,您的示例对我有用:

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 的另一个选项,没有循环。您只需要为 ascale和 acenter提供与您的矩阵相同的列。

maxs <- apply(data, 2, max)    
mins <- apply(data, 2, min)
scale(data, center = mins, scale = maxs - mins)

编辑如何访问结果。

比例返回具有 2 个属性的矩阵。要获取 data.frame,您只需将比例结果强制转换为 data.frame。

dat.scale <- scale(data, center = mins, scale = maxs - mins)
dat.sacle <- as.data.frame(dat.scale)
于 2013-03-29T07:06:09.913 回答
4

centerscale参数的长度scale必须等于 中的列数x。它看起来像dataa data.frame,因此您x的列数与您的列数一样多data.frame,因此存在冲突。你可以通过三种方式克服这个障碍:

  • 在传递给之前将行放入原子向量scale(将其视为单列):scale(as.numeric(x), ...)
  • 转换data为 a matrix,它会自动将行提取放入原子向量。
  • 使用@agstudy 的apply建议,无论它是 adata.frame还是 amatrix都可以,并且可以说是在 R 中执行此操作的“正确”方式。
于 2013-03-29T07:15:11.420 回答
0

还有另一种通过创建函数来缩放数据的方法

 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)
于 2018-09-29T12:57:41.597 回答