Улучшение производительности R - PullRequest
1 голос
/ 24 октября 2019

Я хочу решить статистическую проблему с R. У меня уже есть рабочий подход, но для его решения требуется слишком много времени. Возможно, у кого-то из вас есть идея, как программировать умнее, возможно, без циклов. Есть поле «Заказы». Заказы [, 1] содержат номер заказа, а Заказы [, 2: 200] содержат номера артикулов, заказанных в заказе. Я хотел бы заполнить поле «Результат». В результате [, 1] все номера статей. Поле, которое необходимо заполнить, представляет собой Результат [, 2: 1000] с номерами товаров, которые были приобретены вместе с Результатом [, 1]. Поскольку оба (i- и j-цикл) доходят до более 100000, весь курс занимает ... Прогнозируемое около 60 дней. У кого-нибудь есть идеи по улучшению производительности? Мой рабочий код:

for (i in 1:length(Result$Artiklenumber)) {
  for (j in 1:length(Orders$Ordernumber)) {
    if (length(which(Orders[j,]==Result[i,1])) == 0){
      next
    }
    for (k in 2:(min(which(is.na(Orders[j,])))-1) ) { 
      if ( Orders[j,k]!=Result[i,1] ){
        Result[i,min(which(is.na(Result[i,])))] <- Orders[j,k]
      }
    }
  }
}

Пример для «Заказы»:

0011566702  10131925    10131927    10136287    10136292    NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA
0011677781  16320   16800   16810   18270   18280   807310  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA
0011724272  204520  204590  1083740 1083880 1111150 1111640 NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA
0011760684  10149459    10149460    10149461    10149462    10149463    10149464    10149465    10149466    10149467    10149468    NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA
0011784677  10151542    10151543    10151545    10151549    10151551    10151552    10151555    NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA
0011804598  10107450    10123183    NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA
0011811507  31540   4028890 NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA
0011813716  6670    16800   10050265    NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA
0011818851  16800   16810   807310  4229030 10050265    NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA

Пример для «Результат»:

16610   NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA
16620   NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA
16630   NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA
16670   NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA
16710   NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA
16720   NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA
16740   NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA
16800   NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA
16810   NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA
16820   NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA

1 Ответ

0 голосов
/ 24 октября 2019

Вот решение, которое работает без петель. Сначала я генерирую небольшие тестовые данные:

orders = cbind(1001:1008, matrix(sample(1:6, 8*3, replace=TRUE), 8, 3))
orders[1:2, 4] = orders[4, 3:4] = NA
> orders 
     [,1] [,2] [,3] [,4]
[1,] 1001    2    4   NA
[2,] 1002    2    3   NA
...

, затем извлекаю уникальные статьи:

articles = unique(as.vector(orders[, -1]))

Наконец, я создаю функцию, которая находит товары вместе в некоторой корзине и применяет ее:

findBaskets = function(article) {
  ordersIncludingArticle = apply(orders[, -1] == article, 1, any)
  articlesTogether = unique(as.vector(orders[ordersIncludingArticle, -1]))
  articlesTogether[articlesTogether != article & !is.na(articlesTogether)]
}

sapply(articles, findBaskets)

Однако это дает решение в виде списка:

> res = sapply(articles, findBaskets)
> names(res) = articles
> res 
$`2`
[1] 4 6 3 5 1

$`6`
[1] 3 2 1 5
...

Чтобы поместить это в массив, вы можете создать пустую матрицу с правильными размерами, а затем заполнить матрицу с помощьюпетля или около того. Это наверняка не повредит производительности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...