Получение двух индексов, для которых достигнут максимум

#r #indexing

#r #индексирование

Вопрос:

У меня проблема с получением двух индексов в выходных данных, для которых у нас есть максимум. Давайте рассмотрим следующий код.

 choose_coef<-function(vec){
  t<-seq(from=1,to=2,by=0.5)
  for (i in 1:length(t)){
    for (j in 1:length(t)){
    vec<-append(vec,i/2-j/2)
    }
  }
#which i,j gives max(vec) 
}
  

И что я хочу получить на выходе: максимум для i = … и j = …. Однако я обнаружил, что это не так просто сделать. Легко извлечь один индекс, для которого у нас есть максимум, но проблема возникает, когда у нас есть два индекса. Есть ли какое-либо простое решение, как мы можем это сделать?

Ответ №1:

Непонятно, почему вы передаете вектор этой функции, а затем добавляете материал в ее конец. Я предполагаю, что вы хотите vec быть пустым.

Простым решением будет такая модификация:

 choose_coef <- function() {
  t <- seq(from = 1, to = 2, by = 0.5)
  vec <- numeric()
  for (i in 1:length(t)){
    for (j in 1:length(t)){
    vec <- append(vec, setNames(i/2 - j/2, paste0("i=", i, ";j=", j)))
    }
  }
  names(which.max(vec))
}
  

Который выдает:

 choose_coef()
#> [1] "i=3;j=1"
  

В качестве альтернативы, следующая функция является самоописывающейся, поскольку при запуске она выдает объяснение того, как она работает:

 choose_coef <- function() {
  t <- seq(from = 1, to = 2, by = 0.5)
  vec <- numeric()
  for (i in 1:length(t)){
    for (j in 1:length(t)){
    vec <- append(vec, i/2 - j/2)
    }
  }
 cat("The maximum value was", max(vec), "which occurred at position",
     which.max(vec), "nSince there were", length(t), 
     "iterations of j for each of the", length(t), 
     "iterations of i,nwe know that the maximum occurred on:ni =", 
     (which.max(vec) - 1) %/% length(t)   1, "and j =",
     (which.max(vec) - 1) %% length(t)   1)
}
  

Итак, мы просто делаем:

 choose_coef()
#> The maximum value was 1 which occurred at position 7 
#> Since there were 3 iterations of j for each of the 3 iterations of i,
#> we know that the maximum occurred on:
#> i = 3 and j = 1