无法使量程功能正常工作

Unable to get a range scale function working

我正在尝试对数据集的跨列应用范围缩放公式。 formula 我正在使用的是范围缩放可用方法的均值归一化。

我目前尝试使用以下代码:

rangescale <- function(r){
  colmean <- apply(r,2,mean)
  colsd <- apply(r, 2, sd)
  cv <- sweep(r, 2, colmean, "-")
  xmax <- apply(r, 2, max)
  xmin <- apply(r,2, min)
  ma.mi <- apply(xmax, 2, xmin, "-")
  rv <- sweep(cv, 2, ma.mi, "/")
  return(rv)
}

它给了我:

Error in get(as.character(FUN), mode = "function", envir = envir) : 
  object 'xmin' of mode 'function' was not found 

base r好像没有minimum函数,请问还有其他方法可以得到列的min和max吗?还是我完全遗漏了一些问题?

您可以创建一个函数来应用缩放

rangescale <- function(x) (x  - mean(x))/(max(x) - min(x))

并按列应用它

apply(r, 2, rangescale)

dplyr

library(dplyr)
r %>% summarise_all(rangescale)

要将整个数据集传递给函数,我们可以在函数内部使用 apply

rangescale <- function(r) {
  apply(r, 2, function(x) (x  - mean(x))/(max(x) - min(x)))
}

然后将其命名为:

r1 <- rangescale(r)

这在您当前的用例中可能并不重要,但我将其留在这里供后代使用:

您可以使用 matrixStats 包(对大型矩阵有用)使其更有效:

library(matrixStats)
library(microbenchmark)
set.seed(1)
n.col = 1000
n.row = 120
my.matrix <- matrix(rnorm(n.row * n.col), nrow = n.row)

rangescale1 <- function(x){
    cr <- colRanges(x)
    t((t(x) - colMeans(x))/(cr[,2] - cr[,1]))
}

rangescale2 <- function(r) {
    apply(r, 2, function(x) (x  - mean(x))/(max(x) - min(x)))
}

microbenchmark(
    rangescale1(my.matrix),
    rangescale2(my.matrix)
)
#> Unit: microseconds
#>                    expr      min        lq     mean    median        uq
#>  rangescale1(my.matrix)  823.150  854.3335 1135.847  900.5095  981.5745
#>  rangescale2(my.matrix) 5564.432 5787.9025 6717.374 5905.3510 6687.6110
#>        max neval cld
#>   5689.234   100  a 
#>  21350.869   100   b

all.equal(rangescale1(my.matrix), rangescale2(my.matrix))
#> [1] TRUE

reprex package (v0.3.0)

于 2020-03-30 创建