Как разбить один столбец на несколько строк с каждым пределом строки ячейки - PullRequest
0 голосов
/ 09 ноября 2018

Спасибо за ваше время.

Я не могу найти способ выполнить следующую операцию. Логика операции заключается в разбиении столбца на несколько строк с ограничениями на каждое значение ячейки. для 1-го ряда и второго ряда макс. 250. последующие 500 макс. каждое значение в количестве должно быть разбито на несколько строк на основе этого набора правил. например: - ID 1 имеет 1500 в качестве суммы. когда сломался. первый ряд и второй ряд могут разрешить максимум 250 в качестве значений. и в следующих строках размещается остаток до максимального значения суммы. Данные приведены ниже

Необработанные данные

ID  Name  Amount
1 aa  1500
2 bb  2000
3 cc  1000
4 dd  500

Конечный выход

ID  Name  Amount
1 aa  250
1 aa  250
1 aa  500
1 aa  500
2 bb  250
2 bb  250
2 bb  500
2 bb  500
2 bb  500
2 bb  500
3 cc  250
3 cc  250
3 cc  500
4 dd  250
4 dd  250

1 Ответ

0 голосов
/ 10 ноября 2018

Вот как вы можете сделать это с помощью петель. Не будет слишком плохо, если ваши данные не слишком велики.

x = data.frame("ID"=1:5, "Name"=c("aa","bb","cc","dd","ee"),"Amount"=c(1500,2000,1000,500,800))

do_that = function(x){
    y = x[0,]
    r = 0
    for (i in 1:NROW(x)){
        count = 0
        while (x[i,3] > 0){
            r = r + 1
            y[r,1] = x[i,1]
            y[r,2] = x[i,2]
            y[r,3] = 0
            count = count + 1
            if (count <= 2){
                d = min(x[i,3], 250)
            } else {
                d = min(x[i,3], 500)
                }
            y[r,3] = y[r,3] + d
            x[i,3] = x[i,3] - d
            }
        }
    return (y)
    }

y = do_that(x)
y

Я даже добавил бонусную строку, которая не кратна 250 или 500.

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