剪裁R中最小和最大允许值之间的值

剪裁R中最小和最大允许值之间的值,r,vectorization,clip,clamp,R,Vectorization,Clip,Clamp,在Mathematica中有一个命令Clip[x,{min,max}] 这为min提供了x,这里有一个函数可以同时用于向量和矩阵 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=

在Mathematica中有一个命令
Clip[x,{min,max}]

这为
min提供了
x
,这里有一个函数可以同时用于向量和矩阵

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

myClip这里有一个嵌套的
pmin
pmax
设置边界的方法:

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

fenced.var
Rcpp
为此有
夹具

cppFunction('NumericVector rcpp_clip( NumericVector x, double a, double b){
    return clamp( a, x, b ) ;
}')
下面是一个快速基准测试,显示了它如何与讨论的其他方法进行比较:

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    
pmin\u pmax\u clip我相信这将来自
graster
软件包

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

伟大的非常感谢!!我的函数是waaayy慢,但它的工作速度相当快!这应该在R的基本库中!非常优雅-太棒了!我经常用这个。我有一个大型数据集,其中有几个变量在0以下似乎不是真实的,在高端也应该是合理的约束。真正的诀窍是记住用
pmin
设置最大值,用
pmax
设置最小值。你的“很难找到更快的方法”显然激励了我去看看。是的。它仍然赢得了紧凑性奖。。。到目前为止,我认为函数的参数UB和LB应该颠倒。我怀疑
fence那些时候真是太棒了。只是在控制台会话中粘贴夹紧代码的行显然不是你想要我们Rcpp处女做的。几乎是这样。请参见我在编辑中使用的
cpp功能
。(但是您需要当前的devel版本的
Rcpp
,因为
clamp
自上一个版本以来已被修复)。非常酷。我对
操作的糟糕程度感到震惊和困惑。。。。有时候。你知道为什么所有这些函数的最大值都比最小值大很多吗?我很确定这是关于内存分配的<代码>操作\u clip
执行了很多操作,所以我猜有时需要更长的时间。
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    
library(raster)
clamp(x, lower=-Inf, upper=Inf, ...)