2014-11-13 3 views
2

Я пишу программу в Р. Я застрял здесь.Обрезающие элементы в длинном векторе до +/- порога

У меня есть вектор, как

X=c(84.05, 108.04, 13.95, -194.05, 64.03, 208.05, 84.13, 57.04) 

Я хочу, чтобы получить вектор после замены всех элементов этого вектора, которые> 180 на 180 и все элементы, которые меньше, чем < -180 по -180.

Как я хочу, чтобы получить,

X=c(84.05, 108.04, 13.95,-180, 64.03, 180, 84.13, 57.04) 

Как это сделать ??

Вектор, который я работаю, очень большой.

+0

Эта операция называется * вырезка * или * зажим *. – smci

ответ

8

Попробуйте использовать pmin

> pmin(abs(X), 180)*sign(X) 
[1] 84.05 108.04 13.95 -180.00 64.03 180.00 84.13 57.04 

Benchmark

> Jilber <- function() pmin(abs(X), 180)*sign(X) 
> MrFlick <- function() pmin(pmax(X, -180), 180) 
> user1317221_G <- function() ifelse(X < -180,-180, ifelse(X > 180, 180, X)) 
> benchmark(replications=50000, 
+   Jilber(), 
+   MrFlick(), 
+   user1317221_G(), 
+   columns=c('test', 'elapsed', 'relative')) 
      test elapsed relative 
1  Jilber() 0.835 1.000 
2  MrFlick() 1.297 1.553 
3 user1317221_G() 1.709 2.047 
+1

Думаю, я чаще вижу 'pmin (pmax (X, -180), 180)'. Считаете ли вы, что это более эффективно? – MrFlick

+0

Работа красиво. Спасибо за помощь. – Janak

+0

@MrFlick, ваше решение, вероятно, более эффективно, чем мое, я должен проверить. Очень приятно, кстати. –

1
ifelse(X < -180,-180, ifelse(X > 180, 180, X)) 
+0

Спасибо за помощь. – Janak

Смежные вопросы