Правила распределения для парных транзакций с использованием фрейма данных R - PullRequest
1 голос
/ 12 апреля 2020

Сложная проблема, которую я хотел бы решить, не используя for() l oop в R, потому что полный набор данных, который я использую, очень велик, и его выполнение может длиться вечно. Представьте себе следующие данные:

df_z <- data.frame(z_index       = c(1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4),
                   z             = c(800, 800, 800, 310, 310, 310, 763, 763, 763, 3621, 3621),
                   paired_type   = c("A", "B", "C", "A", "C", "F", "A", "B", "D", "C", "F"),
                   paired_amount = c(0, 1768, 3973, 40, 100, 22, 461, 0, 1499, 10817, 0))

Это показывает 4 разных z суммы (800, 310, 763 и 3621). Для каждого из них у меня есть несколько сумм, каждая из которых имеет paired_type - A, B, C и др. c. Я бы хотел go через каждую строку, постепенно "расходуя" сумму z на сокращение парных сумм, пока z_amount не уменьшится до 0. Этот процесс должен быть выполнен в следующем порядке: offset_type ie A, затем B, затем C, et c.

Так, например, для z_index = 2, Я начинаю с z = 310 и хочу "потратить" 40 на paired_type A, еще 100 на paired_type B и еще 22 на paired_type C, оставив меня с 148 в конце.

Это очень легко сделать в электронной таблице:

enter image description here

но как повернуть это в кусок кода R не очевидно для меня ...

Я должен добавить: мне не нужно просто знать величину z впоследствии, мне также нужно знать каждую из парных сумм (ie последний столбец в электронной таблице).

Может кто-нибудь помочь, пожалуйста? Особенно приветствуются решения на основе dplyr (я говорю dplyr достаточно хорошо)

Спасибо.

1 Ответ

1 голос
/ 12 апреля 2020

Вот один из подходов к этому:

library(dplyr)

df_z %>%
  group_by(z_index) %>%
  mutate(z_after_offset = pmax(0, cumsum(if_else(row_number() == 1, z, 0) - paired_amount)),
         z_after = min(z_after_offset),
         paired_amount_after = pmax(0, paired_amount - lag(z_after_offset, default = first(z))))

# A tibble: 11 x 7
# Groups:   z_index [4]
   z_index     z paired_type paired_amount z_after_offset z_after paired_amount_after
     <dbl> <dbl> <fct>               <dbl>          <dbl>   <dbl>               <dbl>
 1       1   800 A                       0            800       0                   0
 2       1   800 B                    1768              0       0                 968
 3       1   800 C                    3973              0       0                3973
 4       2   310 A                      40            270     148                   0
 5       2   310 C                     100            170     148                   0
 6       2   310 F                      22            148     148                   0
 7       3   763 A                     461            302       0                   0
 8       3   763 B                       0            302       0                   0
 9       3   763 D                    1499              0       0                1197
10       4  3621 C                   10817              0       0                7196
11       4  3621 F                       0              0       0                   0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...