我正在尝试使用以下代码缩放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'
答案 0 :(得分: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的另一个选项,没有循环。您只需要提供与您的矩阵相同的列的scale
和center
。
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)
答案 1 :(得分:4)
center
的{{1}}和scale
参数的长度必须等于scale
中的列数。看起来x
是data
,因此您的data.frame
的列数与x
的列数相同,因此存在冲突。你可以通过三种方式解决这个障碍:
data.frame
(将其视为单个列):scale
scale(as.numeric(x), ...)
转换为data
,将行提取自动删除为原子向量。matrix
建议,无论是apply
还是data.frame
都可以使用,可以说是在R中执行此操作的“正确”方式。答案 2 :(得分:0)
还有另一种通过创建函数来缩放数据的方法
scrollToPosition