2013-12-04 6 views
7

У меня есть векторЗаменить все значения ниже порогового значения в R

x <- c(-1, 0, 1, 2, 3) 

Я хочу, чтобы все значения меньше 1 заменить на 1.

Как?

Есть ли решение без петли?

+3

озираясь я наткнулся с [this] (http://stackoverflow.com/a/11275230/1315767) и [это] (http://stackoverflow.com/a/19571891/1315767), что может быть полезно. –

ответ

9

pmax является хорошим кандидатом на эту

> pmax(x, 1) 
    [1] 1 1 1 2 3 
22

Использование логической индексации с заменой:

x[ x<1 ] <- 1 
+0

Это один из победителей в тестах @Jilber. Раньше я использовал 'pmax' или' pmin', но думаю, что я переключусь. Это так же читаемо и имеет то преимущество, что я не буду неправильно использовать 'pmin' для установки минимума. –

4

Другие решения являются более подходящими. Это просто для удовольствия:

(x > 1) * (x - 1) + 1 
#[1] 1 1 1 2 3 

Простая замена (@Matthew Lundberg) является наиболее эффективным решением:

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 
+0

Интересно :-) –

+0

Это может быть более человечно читаемым как '(x <1)*1 + (x> = 1) * x' :) – lebatsnok

+0

@lebatsnok Это более читаемо, но вам нужны два сравнения. –

0

Другим вариантом было бы replace:

x <- c(-1, 0, 1, 2, 3) 

replace(x, x < 1,1) 
# [1] 1 1 1 2 3 
Смежные вопросы