2013-03-01 1 views
0

Какое число x равно> 5 и падает после 10-й позиции? Это число в позиции 11. Но я нахожу, что пишу длинный код, чтобы получить ответ, и мне интересно, есть ли более быстрый способ.какое число больше x и падает после положения y

x <- c(5,7,3,6,9,4,1,4,7,10,8,5,7,9,7,1, 8, 4, 4,9); 

Определить местоположение всех чисел> 5 называем это x1:

x1 <- which(x>5); 

Определить первое число мест (x1), которые имели место после того, как 10-й позиции:

first(which(x1 >10)) 

этот определяет местоположение 6 x1;

определить местоположение этого числа в исходном векторе (х):

x1[first(which(x1 >10))]; 

теперь мы имеем позицию значения, мы хотим в исходном векторе (х), и этот код тянет значение мы хотите:

x[x1[first(which(x1 >10))]] 

Это кажется очень длинный код, чтобы ответить на простой вопрос, вы знаете, короткий/простой способ добраться до тех же результаты?

+1

Можете ли вы устранить все синтаксические ошибки в коде. R чувствителен к регистру, поэтому 'x' и' X' не являются одинаковыми 'object', а' c' и 'C' тоже не являются одинаковыми. – mnel

+0

Кроме того, я не уверен, почему вы думаете, что 'first' является функцией. Это какой-то пакет, о котором вы не говорили? – joran

+0

извините Joran, его функция xts – user2004820

ответ

4

Что не так с очень простой индексацией и подпиской?

Это дает индексы всех элементов в x больше, чем 5, и которые происходят после того, как положение 10:

> which(x > 5 & seq_along(x) > 10) 
[1] 11 13 14 15 17 20 

Так что окончательный ответ

> which(x > 5 & seq_along(x) > 10)[1] 
[1] 11 

или

> head(which(x > 5 & seq_along(x) > 10), 1) 
[1] 11 

Используемый здесь трюк состоит в генерации вектора индексов от x с использованием функции seq_along(). Таким образом, мы можем сгенерировать все совпадения в одном логическом выражении, а затем выбрать первый из них.

Если вы хотите извлечь идентифицированный элемент, то:

> want <- which(x > 5 & seq_along(x) > 10)[1] 
> x[want] 
[1] 8 

[Это было не ясно, хотите ли вы определить, какой элемент удовлетворяли Ваши критерии или значение этого элемента.]

+0

Спасибо, Гэвин, это полезно – user2004820

+0

@ user2004820, если да, пожалуйста, подумайте о принятии ответа. Подробнее о том, как это сделать и почему это полезно для [so], см. В разделе [ask] [faq]. –

1

An альтернативный вариант с использованием functional программирования, чтобы извлечь индекс:

> Find(function(y) x[y] > 5 & y > 10, seq_along(x)) 
[1] 11 

или для извлечения элемента:

> x[Find(function(y) x[y] > 5 & y > 10, seq_along(x))] 
[1] 8 

Не знаю о различии в производительности по сравнению с простой индексацией.

+0

Спасибо mbask, я только что посмотрел на это и понял, что он «другой». Мне нравится это как другой способ взглянуть на это. – user2004820

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