У меня есть векторЗаменить все значения ниже порогового значения в R
x <- c(-1, 0, 1, 2, 3)
Я хочу, чтобы все значения меньше 1 заменить на 1.
Как?
Есть ли решение без петли?
У меня есть векторЗаменить все значения ниже порогового значения в R
x <- c(-1, 0, 1, 2, 3)
Я хочу, чтобы все значения меньше 1 заменить на 1.
Как?
Есть ли решение без петли?
pmax
является хорошим кандидатом на эту
> pmax(x, 1)
[1] 1 1 1 2 3
Использование логической индексации с заменой:
x[ x<1 ] <- 1
Это один из победителей в тестах @Jilber. Раньше я использовал 'pmax' или' pmin', но думаю, что я переключусь. Это так же читаемо и имеет то преимущество, что я не буду неправильно использовать 'pmin' для установки минимума. –
Другие решения являются более подходящими. Это просто для удовольствия:
(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
Интересно :-) –
Это может быть более человечно читаемым как '(x <1)*1 + (x> = 1) * x' :) – lebatsnok
@lebatsnok Это более читаемо, но вам нужны два сравнения. –
Другим вариантом было бы replace
:
x <- c(-1, 0, 1, 2, 3)
replace(x, x < 1,1)
# [1] 1 1 1 2 3
озираясь я наткнулся с [this] (http://stackoverflow.com/a/11275230/1315767) и [это] (http://stackoverflow.com/a/19571891/1315767), что может быть полезно. –