Распределение значений в многовариантных отношениях - PullRequest
0 голосов
/ 01 февраля 2019

У меня есть набор данных, который мне нужен для распределения значений из точек приема (RP) и точек доставки (DP), которые имеют различные отношения подключения (один к одному, один к немногим, один ко многим, многиеодин-ко-многим-немногим-многим-многим).Эти значения поступления и доставки должны быть распределены по номеру контракта, а значения для каждого контракта между точками получения и доставки всегда суммируются одинаково (т. Е. Квитанции суммы == deliveryysums), но отдельные значения поступления и доставки не могут (т.е. не являются корзиной).проблема упаковки).Отношения один-к-одному легко решаются путем фильтрации, где стоимость получения номера контракта и сумма стоимости доставки имеют только одну строку каждого (всего две строки / контракт).

Многие-немногим (или наоборот)наоборот) оказывается проблематичным.

Неважно, от какого RP DP получает свое распределение.

Решение этого вопроса в некоторой степени касается рассматриваемой проблемы, и именно над этим я работаюoff R: Распределение суммы как можно более равномерно II

Я начал изучать R в субботу для этого рабочего проекта fwiw.В Excel я бы сделал функцию min для ранга asc, но здесь это не работает, так как мне нужно создавать новые строки в некоторых случаях, сохраняя имена RP & DP и номер контракта.

У меня естьизображение ниже.

Любые указатели были бы полезны.

Спасибо, Карл

Объемные данные

enter image description here

1 Ответ

0 голосов
/ 04 февраля 2019

Вот решение, которое я нашел.

databuild <-function() {
        allonew <<- data.frame(Contract.Number=character(), Contract.Receipt.Point=character(),Contract.Delivery.Point=character(),Contract.Volumes.Mdthd=numeric())
        allorow <- data.frame(Contract.Number=character(), Contract.Receipt.Point=character(),Contract.Delivery.Point=character(),Contract.Volumes.Mdthd=numeric())
        deliveryct <<- 1
        receipt.vols <- numeric()
        receipt.vols <- c(200,310,100,40)
        receipt.name <<- c("rtest1", "rtest2", "rtest3", "rtest4")
        delivery.name <<- c("dtest1","dtest2")
        contract <<- 1260
        r.count <-length(receipt.vols)
        contract.receipt.vols <<- receipt.vols[!is.na(receipt.vols)]
        rec.sum <<- sum(receipt.vols)
        contract.vols.sum <-rec.sum*2
            delivery.vols <- c(500,150)
        d.count <-length(delivery.vols)
        contract.delivery.vols <<- delivery.vols[!is.na(delivery.vols)]
        receipt.vols <- receipt.vols[receiptct]
        delivery.vols <- delivery.vols[deliveryct]
        browser()
            while(contract.vols.sum/rec.sum !=1) {
              if(receipt.vols == delivery.vols) {
                    while(receipt.vols == delivery.vols)  {
                        contract.vols <-min(receipt.vols,delivery.vols)
                        contract.vols.sum <- contract.vols.sum - contract.vols
                        allorow <- as.data.frame(t(c(contract[1],receipt.name[receiptct],delivery.name[deliveryct],contract.vols)))
                        colnames(allorow) <- colnames(allonew)
                        allonew <-rbind(allonew,allorow)
                        deliveryct <-deliveryct + 1
                        receiptct <- receiptct + 1
                          if(receiptct > r.count) {
                          break
                        }  
                        delivery.vols <- contract.delivery.vols[deliveryct]
                        receipt.vols <- contract.receipt.vols[receiptct] 
                        }
                } else if(receipt.vols < delivery.vols) {
                        while(receipt.vols < delivery.vols) {
                            contract.vols <- min(receipt.vols,delivery.vols)
                            delivery.vols <- delivery.vols - contract.vols
                            contract.vols.sum <- contract.vols.sum - contract.vols
                            allorow <- as.data.frame(t(c(contract[1],receipt.name[receiptct],delivery.name[deliveryct],contract.vols)))
                            colnames(allorow) <- colnames(allonew)
                            allonew <-rbind(allonew,allorow)
                            receiptct <- receiptct + 1
                            receipt.vols <- contract.receipt.vols[receiptct]
                    }
                } else if(receipt.vols > delivery.vols) {
                        while(receipt.vols > delivery.vols) {
                            contract.vols <-min(receipt.vols,delivery.vols)
                            receipt.vols <- receipt.vols- contract.vols
                            contract.vols.sum <- contract.vols.sum - contract.vols
                            allorow <- as.data.frame(t(c(contract[1],receipt.name[receiptct],delivery.name[deliveryct],contract.vols)),stringsAsFactors = FALSE)
                                colnames(allorow) <- colnames(allonew)
                            allonew <-rbind(allonew,allorow)
                            deliveryct <- deliveryct + 1
                            delivery.vols <- contract.delivery.vols[deliveryct]
                        }
                } else next

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