Сортировать список массивов в R - PullRequest
0 голосов
/ 06 мая 2018

У меня есть список массивов, и я хочу выбрать лучший массив (лучший означает тот, который имеет наименьшую сумму всех значений внутри массива).

v1 = c(5,5,5,5)
v2 = c(6,6,6,6)
v3 = c(7,7,7,7)
v4 = c(8,8,8,8)
v5 = c(1,1,1,1)
v6 = c(2,2,2,2)
v7 = c(3,3,3,3)
v8 = c(4,4,4,4)
arr1 = array(c(v1,v2,v3,v4), dim = c(4,4))
arr2 = array(c(v5,v6,v7,v8), dim = c(4,4))
myList = list(arr1,arr2)

Есть ли функция, которая может это сделать? Мне нужно сделать это в таком цикле:

solve <- function() {
  A <- myList
  while(length(A) != 0) {
    X <- pickBestFrom(A)
    if(isSolution(X)){
      return(X)
      break
    }
    Y <- neighbors(X)
    A <- append(A,Y)
    A <- unique(A)
  }
}

Как вы думаете, лучше ли каждый раз находить «лучшее» значение из моего списка или сначала упорядочить список, а затем выбрать первый элемент?

1 Ответ

0 голосов
/ 06 мая 2018

Если мой комментарий выше, то есть, , вам нужна pickBestFrom функция , тогда есть две альтернативы, с кодом для их синхронизации.

Сначала сортируются суммы, а затем выбирается самый маленький элемент списка.
Вторая выбирает меньшую сумму, используя which.min, и быстрее.

pickBestFrom1 <- function(X){
    X[[ order(sapply(X, sum))[1] ]]
}

pickBestFrom2 <- function(X){
    X[[which.min(sapply(X, sum))]]
}

microbenchmark::microbenchmark(
    order = pickBestFrom1(myList),
    which.m = pickBestFrom2(myList),
    times = 1e3
)

Второй тест, с большим списком. which.min по-прежнему самый быстрый.

list2 <- lapply(1:1000, function(i) array(rnorm(16), dim = c(4, 4)))

microbenchmark::microbenchmark(
    order = pickBestFrom1(list2),
    which.m = pickBestFrom2(list2),
    times = 1e3
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...