Мой ДФ выглядит примерно так:
data <- data.frame(
"id" = c(2, 4, 5),
"paid" = c(80, 293.64, 157),
"basic_fee" = c(500, 140.59, 21.49),
"marketing_fee" = c(151.51, 10.12, 562.50),
"utility_fee" = c(65, 99.29, 102.35),
stringsAsFactors = F)
Чего бы я хотел достичь, так это
final <- data.frame(
"id" = c(2, 4, 5),
"paid" = c(80, 293.64, 157),
"basic_fee" = c(500, 140.59, 21.49),
"marketing_fee" = c(151.51, 10.12, 562.50),
"utility_fee" = c(65, 99.29, 102.35),
"paid_basic" = c(80, 140.59, 21.49),
"paid_marketing" = c(0, 10.12, 135.51),
"paid_utlity" = c(0, 99.29, 0),
stringsAsFactors = F)
На самом деле логика между ними довольно проста. Для каждого идентификатора получите сумму оплаченной стоимости, затем «платите как можно больше» на оплату услуг с приоритетом в порядке - основной, маркетинговый, коммунальный. Обратите внимание, что никакая комиссия не может выплачивать сумму, превышающую ее фактическую стоимость.
Мой код работает, но он очень уродлив для повторяющихся частей кода. Теперь у меня есть еще более сложный датафрейм со 100+ столбцами. Я не хочу создавать код с еще более и более сложным кодом, если в нем еще тысячи строк.
final <-
data %>%
mutate(
paid_basic = if_else(basic_fee - paid > 0, basic_fee - (basic_fee - paid), basic_fee),
overpayment_basic = if_else(paid-paid_basic > 0, 1, 0),
paid_marketing = if_else(overpayment_basic == 1, (paid-paid_basic), 0),
paid_marketing = if_else(paid_marketing > marketing_fee, marketing_fee, paid_marketing),
overpayment_marketing = if_else(paid-paid_basic-paid_marketing > 0, 1, 0),
paid_utility = if_else(overpayment_marketing == 1, (paid-paid_basic-paid_marketing), 0),
paid_utility = if_else(paid_utility > utility_fee, utility_fee, paid_utility)
)