38

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
  • 65,555
  • 14
  • 143
  • 159
user3453272
  • 467
  • 1
  • 5
  • 6

3 Answers3

42

Use which and take the first element of the result:

which(b > 0.65)[1]
#[1] 3
Roland
  • 127,288
  • 10
  • 191
  • 288
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
  • 965
  • 11
  • 15
Phuoc
  • 1,073
  • 8
  • 20
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
  • 65,555
  • 14
  • 143
  • 159
  • 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