DMwR :: unscale只对选定的列不进行缩放

时间:2018-07-13 10:22:29

标签: r scaletransform

我有一个data.frame,其中有4列我想scale,然后添加一些新列(不缩放它们)。然后,我执行一些计算,之后只需要unscale仅前四列(因为其余两列没有首先缩放)。 DMwR::unscale似乎允许使用col.ids参数。但是当我指定如下所示的功能时,它会返回

  

DMwR :: unscale(cbind(scale(x),x2),scale(x),1:4)中的错误:    数据尺寸不正确,无法缩放。

x <- matrix(2*rnorm(400) + 1, ncol = 4)
x2 <- matrix(9*rnorm(200), ncol = 2)
DMwR::unscale(cbind(scale(x), x2), scale(x), 1:4)

我在做什么错?如何仅对矩阵的选定的前4列取消缩放?

1 个答案:

答案 0 :(得分:1)

DMwR::unscale(vals, norm.data, col.ids)函数要求norm.data的列数大于vals的列数。
我建议考虑以下unscale的修改版本:

myunscale <- function (vals, norm.data, col.ids)  {
    cols <- if (missing(col.ids)) 1:NCOL(vals) else col.ids
    if (length(cols) > NCOL(vals)) 
        stop("Incorrect dimension of data to unscale.")
    centers <- attr(norm.data, "scaled:center")[cols]
    scales <- attr(norm.data, "scaled:scale")[cols]
    unvals <- scale(vals[,col.ids], center = (-centers/scales), scale = 1/scales)
    unvals <- cbind(unvals,vals[,-col.ids])
    attr(unvals, "scaled:center") <- attr(unvals, "scaled:scale") <- NULL
    unvals
}

set.seed(1)
x <- matrix(2*rnorm(4000) + 1, ncol = 4)
x2 <- matrix(9*rnorm(2000), ncol = 2)
x_unsc <- myunscale(cbind(scale(x), x2), scale(x) , 1:4)

x_unsc的平均值和标准偏差为:

apply(x_unsc, 2, mean)
# [1]  0.9767037  0.9674762  1.0306181  1.0334445 -0.1805717 -0.1053083

apply(x_unsc, 2, sd)
# [1] 2.069832 2.079963 2.062214 2.077307 8.904343 8.810420