I have a vector
x <- c(-1, 0, 1, 2, 3)
I want all values less than 1 to be replaced by 1.
How?
Is there a no-loop solution?
I have a vector
x <- c(-1, 0, 1, 2, 3)
I want all values less than 1 to be replaced by 1.
How?
Is there a no-loop solution?
Use logical indexing with replacement:
x[ x<1 ] <- 1
 
    
    The other solutions are more appropriate. This is just for fun:
(x > 1) * (x - 1) + 1
#[1] 1 1 1 2 3
Simple replacement (@Matthew Lundberg) is the most efficient solution:
library(microbenchmark)
microbenchmark(pmax(1, x),
               "[<-"(x, x < 1, 1),
               (x > 1) * (x - 1) + 1)
# Unit: microseconds
#                   expr    min      lq  median      uq    max neval
#             pmax(1, x) 15.494 16.2545 16.5165 16.9365 52.165   100
#     `[<-`(x, x < 1, 1)  1.466  1.6920  2.3325  2.7485 23.683   100
#  (x > 1) * (x - 1) + 1  2.084  2.2870  2.7880  3.2080  8.958   100
 
    
    Another option would be replace:
x <- c(-1, 0, 1, 2, 3)
replace(x, x < 1,1)
# [1] 1 1 1 2 3
