Начиная с 2 объектов: 1 блок данных атрибутов заказа - номера заказов, веса и тома и 1 список комбинаций строк номеров заказов.Эффективное совпадение/поиск в R
attr <- data.frame(Order.No = c(111,222,333), Weight = c(20,75,50), Volume = c(10,30,25))
combn <- list(111, 222, 333, c(111,222), c(111,333), c(222,333), c(111,222,333))
Цель состоит в том, чтобы найти общий вес и куб для каждой строки заказов, и сохранить только комбинации, которые находятся в пределах двух весовых и куба ограничений.
настоящее время я использую следующий -
# Lookup weights for each Order.No in the attr table
# Add up total weight for the combination and keep it if it's in the range
wgts <- lapply(combn, function(x) {
temp <- attr$Weight[match(x, attr$Order.No)]
temp <- sum(temp)
temp[temp <= 50 & temp >= 20]
})
> wgts
[[1]]
[1] 20
[[2]]
numeric(0)
[[3]]
[1] 50
[[4]]
numeric(0)
[[5]]
numeric(0)
[[6]]
numeric(0)
[[7]]
numeric(0)
# Lookup volumes for each Order.No in the attr table
# Add up total volume for the combination and keep it if it's in the range
vols <- lapply(combn, function(x) {
temp <- attr$Volume[match(x, attr$Order.No)]
temp <- sum(temp)
temp[temp <= 50 & temp >= 10]
})
> vols
[[1]]
[1] 10
[[2]]
[1] 30
[[3]]
[1] 25
[[4]]
[1] 40
[[5]]
[1] 35
[[6]]
numeric(0)
[[7]]
numeric(0)
Затем используйте mapply, чтобы объединить два списка весов и объемов.
# Find and keep only the rows that have both the weights and volumes within their ranges
which(lapply(mapply(c, wgts, vols), function(x) length(x)) == 2)
# Yields position 1 and 3 which meet the subsetting conditions
> value value
1 3
Код выше ищет вес отдельных заказов и кубы, суммирует их все вместе, проверяет, чтобы убедиться, что они находятся в пределах каждого предела диапазона, объединяет оба список вместе и сохраняет только те, которые имеют как вес и кубики в допустимых пределах.
Мое текущее решение, которое успешно завершает задачу, очень медленное по объему производства и не очень хорошо масштабируется с миллионами записей. При использовании комбинаций порядка 11 ММ для поиска этот процесс занимает около 40 минут, что неприемлемо.
Я ищу более эффективный метод, который резко сократит время выполнения, необходимое для получения того же выхода.
BTW, 'combn',' attr' - это имена функций – akrun
Что такое 'c' в вашем примере? (последняя строка примерного кода) –
Пожалуйста, укажите желаемый результат –