是否有一种方法可以将data.frame
列中高于或低于设置阈值的值替换为用户在单个步骤中确定的最大/最小阈值?
data.table::between()
函数返回TRUE
或FALSE
,但没有指示它是在上方还是在下方...
有关MWE,请参见下文。我可以分两步得到结果,但是想知道是否已经有一个内置函数,可以用max / min值替换max / min值之上/之下的值。
谢谢。
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
由reprex package(v0.2.1)于2019-08-12创建
答案 0 :(得分:4)
可以通过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
答案 1 :(得分:1)
关于此线程: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]
这与管道解决方案相同。