Как я могу улучшить это l oop (и есть ли другие решения, кроме циклов)? - PullRequest
1 голос
/ 10 апреля 2020

Это проблема комбинации. У меня 10 магазинов. Я хочу найти 8 лучших магазинов, которые минимизируют сумму расстояний от моих 100 наблюдений.

Из матрицы комбинаций 'test_comb_matrix' я получу sh, чтобы извлечь комбинации из 8 на каждой итерации выбора (10 8). Затем я применяю эти индексы к матрице расстояний test_dist_matrix и записываю расстояния. Я использую pmin (), чтобы найти ближайший магазин для каждого наблюдения, затем записываю минимум в myminCol.

Ниже приведен мой код (прокрутите вниз, чтобы получить воспроизводимый код). Я хочу удалить бит «от a до h».

for(i in 1:nrow(testDat))
{
  print(i)

  # get indices from combination matrix
  a <- test_comb_matrix[1, i]
  b <- test_comb_matrix[2, i]
  c <- test_comb_matrix[3, i]
  d <- test_comb_matrix[4, i]
  e <- test_comb_matrix[5, i]
  f <- test_comb_matrix[6, i]
  g <- test_comb_matrix[7, i]
  h <- test_comb_matrix[8, i]

  # find the minimum
  myminCol <- as.vector(pmin(test_dist_matrix[, a], test_dist_matrix[, b],
                             test_dist_matrix[, c], test_dist_matrix[, d],
                             test_dist_matrix[, e], test_dist_matrix[, f],
                             test_dist_matrix[, g], test_dist_matrix[, h]))
  # sum distances
  mySum <- sum(myminCol)

  testDat[i, 1] <- mySum
}

Воспроизводимый код:

# number of combinations from 10 choose 8 
n <- choose(10, 8)

# get combination matrix
test_comb_matrix <- combn(1:10, 8)
# view first 5 combinations
test_comb_matrix[, 1:5]

# create distance matrix for 100 observations and 10 columns
test_dist_matrix <- data.frame(matrix(rnorm(100), nrow = 100, ncol = 10))


testDat <- data.frame(matrix(NA, nrow = n, ncol = 1))
names(testDat) <- "min"

1 Ответ

1 голос
/ 10 апреля 2020

Попробуйте использовать это:

result_vec <-  sapply(seq_len(nrow(testDat)), function(i) 
  sum(matrixStats::rowMins(as.matrix(test_dist_matrix[, test_comb_matrix[, i]]))))
...