Home > front end >  How to find the index without using which(), match(), %in%?
How to find the index without using which(), match(), %in%?

Time:10-18

I am unable to find the index position of my max_value without using which(), match(), %in%

vect_1 <- c(2, 3, 1, 4, 5, 10, 7, 6, 9, 8)

n <- length(vect_1)
max_value <- vect_1[1]

for (i in 1:n) {
  if (vect_1[i] > max_value) {
    max_value <- vect_1[i]
  }
  if (max_value == vect_1[i]) {
    print(i)
  }
}

[1] 1
[1] 2
[1] 4
[1] 5
[1] 6

I know the max_value is 10 but I am unable to get i == 6 only

CodePudding user response:

The loop should look like this:

n <- length(vect_1)
max_value <- vect_1[1]
max_value_idx <- 1

for (i in 1:n) {
  if (vect_1[i] > max_value) {
    max_value <- vect_1[i]
    max_value_idx <- i
  }
}
print(paste0("Max value: ", max_value," Index: ",max_value_idx))

CodePudding user response:

If you use print, each iteration will print something to the console. I think we never need print in serious R loops, and seldom need for loops in serious R. Regardless, here are two separate ideas of a solution, (where I think you're mixing up the two).

1. Max. is known

In this case we just compare each element with max_value and if they match, store the index in the result.

n <- length(vect_1)
res <- NA

for (i in seq_len(n)) {
  if (vect_1[i] == max_value) {
    res <- i
  }
}
res
# [1] 6

2. Max. is unknown

In this case, we don't know the max yet. We want a starting value mx that is smaller than everything that may come, which is -Inf. if we get something greater, we update mx and store the index in the result.

n <- length(vect_1)
mx <- -Inf
res <- NA

for (i in seq_len(n)) {
  if (vect_1[i] > mx) {
    mx <- vect_1[i]
    res <- i
  }
}
mx
# [1] 10

res
# [1] 6

Concluding remark

Note, that I consider this might be a nice task for practicing for loops and train respective thinking. However there's no point to use the R language for that, where we simply may do

which.max(vect_1)
# [1] 6

which gives the same result (if there are no ties).

  • Related