35

I am looking for a condition which will return the index of a vector satisfying a condition.

For example- I have a vector b = c(0.1, 0.2, 0.7, 0.9) I want to know the first index of b for which say b >0.65. In this case the answer should be 3

I tried which.min(subset(b, b > 0.65)) But this gives me 1 instead of 3.

Please help

Henrik
  • 61,039
  • 13
  • 131
  • 152
user3453272
  • 437
  • 1
  • 5
  • 6

3 Answers3

39

Use which and take the first element of the result:

which(b > 0.65)[1]
#[1] 3
Roland
  • 122,144
  • 10
  • 182
  • 276
2

Be careful, which.max is wrong if the condition is never met, it does not return NA:

> a <- c(1, 2, 3, 2, 5)
> a >= 6
[1] FALSE FALSE FALSE FALSE FALSE
> which(a >= 6)[1]
[1] NA  # desirable
> which.max(a >= 6)
[1] 1   # not desirable

Why? When all elements are equal, which.max returns 1:

> b <- c(2, 2, 2, 2, 2)
> which.max(b)
[1] 1

Note: FALSE < TRUE

Gord Stephen
  • 845
  • 11
  • 15
Phuoc
  • 1,003
  • 7
  • 18
0

You may use which.max:

which.max(b > 0.65)
# [1] 3

From ?which.max: "For a logical vector x, [...] which.max(x) return[s] the index of the first [...] TRUE

b > 0.65
# [1] FALSE FALSE  TRUE  TRUE

You should also have a look at the result of your code subset(b, b > 0.65) to see why it can't give you the desired result.

Henrik
  • 61,039
  • 13
  • 131
  • 152
  • 2
    I just downvoted since I found the same error as Phuoc found below. It will return 1 in case the condition never met while Roland 's solution could return NA. – Yuan Tao Aug 17 '18 at 14:54