无法使量程功能正常工作
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 创建
我正在尝试对数据集的跨列应用范围缩放公式。 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 创建