R语言 用最大/最小值替换最大/最小值之外的值

s5a0g9ez  于 2023-05-20  发布在  其他
关注(0)|答案(2)|浏览(157)

是否有方法将data.frame列中高于或低于设定阈值的值替换为用户在单个步骤中确定的最大/最小阈值?
data.table::between()函数返回TRUEFALSE,但没有指示它是高于还是低于...
参见下文的MWE。我可以在2个步骤中得到结果,但想知道是否已经有一个内置的函数,用于用最大/最小值替换高于/低于最大/最小值的值。
谢谢

library(data.table)
library(magrittr)

a <- data.table(colA = LETTERS[seq(1,10)],
                colB = 1:10)

the_max <- 7
the_min <- 3

# creates TRUE/FALSE column...
a[, colC := between(colB, the_min, the_max)]
a
#>     colA colB  colC
#>  1:    A    1 FALSE
#>  2:    B    2 FALSE
#>  3:    C    3  TRUE
#>  4:    D    4  TRUE
#>  5:    E    5  TRUE
#>  6:    F    6  TRUE
#>  7:    G    7  TRUE
#>  8:    H    8 FALSE
#>  9:    I    9 FALSE
#> 10:    J   10 FALSE

# gets the result...
a[, colD := colB] %>% 
  .[colD < the_min, colD := the_min] %>% 
  .[colD > the_max, colD := the_max]
a
#>     colA colB  colC colD
#>  1:    A    1 FALSE    3
#>  2:    B    2 FALSE    3
#>  3:    C    3  TRUE    3
#>  4:    D    4  TRUE    4
#>  5:    E    5  TRUE    5
#>  6:    F    6  TRUE    6
#>  7:    G    7  TRUE    7
#>  8:    H    8 FALSE    7
#>  9:    I    9 FALSE    7
#> 10:    J   10 FALSE    7

创建于2019-08-12由reprex package(v0.2.1)

4c8rllxm

4c8rllxm1#

可以用pmin/pmax来实现

a[, colD := pmin(pmax(the_min, colB), the_max)]
a
#    colA colB colD
# 1:    A    1    3
# 2:    B    2    3
# 3:    C    3    3
# 4:    D    4    4
# 5:    E    5    5
# 6:    F    6    6
# 7:    G    7    7
# 8:    H    8    7
# 9:    I    9    7
#10:    J   10    7
yzuktlbb

yzuktlbb2#

关于此线程:Replace all values lower than threshold in R
这应该更有效,但是它使用了与 *akrun的 * 答案相同的逻辑。

pmaxmin <- 
  function(x, mmax, mmin) {
     `[<-`(x, x < mmin, mmin) -> y
     `[<-`(y, y > mmax, mmax) -> z
     z
 }

a[, colD := pmaxmin(colB, the_max, the_min)][]

#     colA colB colD
#  1:    A    1    3
#  2:    B    2    3
#  3:    C    3    3
#  4:    D    4    4
#  5:    E    5    5
#  6:    F    6    6
#  7:    G    7    7
#  8:    H    8    7
#  9:    I    9    7
# 10:    J   10    7

p.s.你不需要magrittr来在data.table中执行多个步骤:

a[, colD := colB][
  colD < the_min, colD := the_min][
    colD > the_max, colD := the_max]

这与管道解决方案的作用相同。

相关问题