mtext change adjust r vectorization clip clamp

change - Valores de clip entre un valor mínimo y máximo permitido en R



plot title r (4)

En Mathematica existe el comando Clip[x, {min, max}] que da x para min<=x<=max , min para x<min y max para x>max , vea

http://reference.wolfram.com/mathematica/ref/Clip.html ( mirror )

¿Cuál sería la forma más rápida de lograr esto en R? Idealmente, debería ser una función que se pueda listar, e idealmente debería funcionar en un solo valor, vector, matriz o marco de datos ...

Saludos, Tom


Aquí hay un método con pmin y pmax anidados que establecen los límites:

fenced.var <- pmax( LB, pmin( var, UB))

Será difícil encontrar un método que sea más rápido. Envuelto en una función que por defecto está en un rango de 3 y 7:

fence <- function(vec, UB=7, LB=3) pmax( LB, pmin( vec, UB)) > fence(1:10) [1] 3 3 3 4 5 6 7 7 7 7


Aquí hay una función que funcionará tanto para vectores como para matrices.

myClip <- function(x, a, b) { ifelse(x <= a, a, ifelse(x >= b, b, x)) } myClip(x = 0:10, a = 3,b = 7) # [1] 3 3 3 3 4 5 6 7 7 7 7 myClip(x = matrix(1:12/10, ncol=4), a=.2, b=0.7) # myClip(x = matrix(1:12/10, ncol=4), a=.2, b=0.7) # [,1] [,2] [,3] [,4] # [1,] 0.2 0.4 0.7 0.7 # [2,] 0.2 0.5 0.7 0.7 # [3,] 0.3 0.6 0.7 0.7

Y aquí hay otro:

myClip2 <- function(x, a, b) { a + (x-a > 0)*(x-a) - (x-b > 0)*(x-b) } myClip2(-10:10, 0, 4) # [1] 0 0 0 0 0 0 0 0 0 0 0 1 2 3 4 4 4 4 4 4 4


Creo que sería clamp() del paquete raster .

library(raster) clamp(x, lower=-Inf, upper=Inf, ...)


Rcpp tiene clamp para esto:

cppFunction(''NumericVector rcpp_clip( NumericVector x, double a, double b){ return clamp( a, x, b ) ; }'')

Aquí hay una referencia rápida que muestra cómo se desempeña frente a otros métodos discutidos:

pmin_pmax_clip <- function(x, a, b) pmax(a, pmin(x, b) ) ifelse_clip <- function(x, a, b) { ifelse(x <= a, a, ifelse(x >= b, b, x)) } operations_clip <- function(x, a, b) { a + (x-a > 0)*(x-a) - (x-b > 0)*(x-b) } x <- rnorm( 10000 ) require(microbenchmark) microbenchmark( pmin_pmax_clip( x, -2, 2 ), rcpp_clip( x, -2, 2 ), ifelse_clip( x, -2, 2 ), operations_clip( x, -2, 2 ) ) # Unit: microseconds # expr min lq median uq max # 1 ifelse_clip(x, -2, 2) 2809.211 3812.7350 3911.461 4481.0790 43244.543 # 2 operations_clip(x, -2, 2) 228.282 248.2500 266.605 1120.8855 40703.937 # 3 pmin_pmax_clip(x, -2, 2) 260.630 284.0985 308.426 336.9280 1353.721 # 4 rcpp_clip(x, -2, 2) 65.413 70.7120 84.568 92.2875 1097.039