Вот решение, которое работает без петель. Сначала я генерирую небольшие тестовые данные:
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
...
Чтобы поместить это в массив, вы можете создать пустую матрицу с правильными размерами, а затем заполнить матрицу с помощьюпетля или около того. Это наверняка не повредит производительности.