2013-03-29 20 views
6

我试图在0和1范围内使用以下代码缩放数据框:R中的比例缩放数据给出了错误错误“中心的长度”必须等于“x”的列数“

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' 

回答

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和一个center与您的矩阵相同的列。

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

编辑如何访问结果。

该比例返回一个包含2个属性的矩阵。要获得数据帧,您只需将比例结果强制转换为data.frame。

dat.scale <- scale(data, center = mins, scale = maxs - mins) 
dat.sacle <- as.data.frame(dat.scale) 
+1

感谢做到这一点。但是当我将scale函数的输出分配给某个变量时,我无法提取数据部分。我认为scale函数输出中还有其他几个属性。 – Shahzad

+0

@Shahzad你的数据是一个有2个额外属性的矩阵。例如,你可以使用'as.vector(data)'来移除它们。 – agstudy

+0

@Shahzad他们真的在路上?您可以使用'attributes(x)< - list(dim = dim(x))' –

4

centerscale参数scale必须有长度等于列在x数量。它看起来像datadata.frame,所以你的x有你的data.frame那么多列,因此冲突。你可以突破这个障碍三种方式:

  • 降行进入原子载体传递给scale(将其当作一列)前:scale(as.numeric(x), ...)
  • 转换datamatrix,这滴排自动提取到原子向量中。
  • 使用@ agstudy的apply建议,该建议将工作不管它是一个data.framematrix,可以说是“正确”的方式在R.
+1

+1为data.frame猜测!这一点并不明显。 – agstudy

+1

@agstudy谢谢。列名是放弃的。 –

相关问题