在这份销售报告中,有一个特定的资金池需要按不同的百分比(总和为100%)分配给六个组.然而,由于需要进行会计四舍五入,根据总数的不同,经常会有几分钱的差异.

例如:

# TOTAL
total <- 12345.02

# PERCENT ALLOCATIONS
perA <- .12
perB <- .23
perC <- .22
perD <- .13
perE <- .11
perF <- .19

# ALLOCATIONS
amtA <- total * perA
amtB <- total * perB
amtC <- total * perC
amtD <- total * perD
amtE <- total * perE
amtF <- total * perF

这些计算是正确的,但当采用accounting时,如预期的那样,将需要四舍五入到小数点后两位,在此期间,并非所有资金都得到分配.

结果:

library(formattable)

accounting(amtA) = $ 1,481.40
accounting(amtB) = $ 2,839.35
accounting(amtC) = $ 2,715.90
accounting(amtD) = $ 1,604.85
accounting(amtE) = $ 1,357.95
accounting(amtF) = $ 2,345.55
-----------------------------
sum              = $12,345.00 =/= $12,345.02

我本质上想知道是否有一种简单的方法来判断四舍五入分配的总和与原始总数,处理四舍五入的数字而不考虑精度.从这里开始,如果需要,按特定顺序(E、A、C、B、D、F)分配任何剩余资金.

因为我知道哪个更改将导致错误,因为我的6&amp;百分比组是静态的,所以我有一个简单的方法来判断总数,如果它以问题 case 结束,并设置应用它的规则.

library(dplyr)
library(stringr)

# OFF BY ONE CENT THAT NEEDS ALLOCATED
singlepos <- c("01","18",...)
# OFF BY TWO CENTS THAT NEED ALLOCATED
doublepos <- c("02","98",...)
# OFF BY ONE CENT THAT NEEDS UNALLOCATED
singleneg <- c("07","08",...)

amtE <- round(total * perE,2)
amtE <- case_when(
   str_sub(as.character(amtE), starts = -2) %in% singlepos ~ amtE+.01,
   str_sub(as.character(amtE), starts = -2) %in% doublepos ~ amtE+.01,
   str_sub(as.character(amtE), starts = -2) %in% singleneg ~ amtE-.01,
   .default = amtE
)

然而,这远远不是理想的,因为对于这一特定的6人组,有40个求和错误的例子.也许一些模除法是合适的,但本周五下午,我无法理解是否可以将其应用于这种情况.

任何帮助或提示都将不胜感激.

推荐答案

如果我理解正确的话,您可以使用for循环按所需顺序分配任何剩余资金:

total <- 12345 + .02

per <- c(.12, .23, .22, .13, .11, .19)
amt <- round(total * per, 2)

delta <- as.integer(100 * (total - sum(amt)))

total - sum(amt)
#> [1] 0.02

# E -> A -> C -> B -> D -> F
for (i in c(5, 1, 3, 2, 4, 6)) {
  if (delta > 0L) {
    amt[[i]] <- amt[[i]] + .01
    delta <- delta - 1L
  } else if (delta < 0L) {
    amt[[i]] <- amt[[i]] - .01
    delta <- delta + 1L
  } else {
    break
  }
}

library(formattable)

# Check
total - sum(amt)
#> [1] 0

accounting(amt)
#> [1] 1,481.41 2,839.35 2,715.90 1,604.85 1,357.96 2,345.55

R相关问答推荐

具有多个依赖变量/LHS的逻辑模型

寻找图片边缘

查找图下的面积

抖动点与嵌套类别变量箱形图的位置不对齐

从开始时间和结束时间导出时间

derrr summarise每个组返回多行?

2个Rscript.exe可执行文件有什么区别?

根据现有列的名称和字符串的存在进行变异以创建多个新列

使用for循环和粘贴创建多个变量

当我添加美学时,geom_point未对齐

按时间顺序对不同事件进行分组

从非重叠(非滚动)周期中的最新数据向后开窗并在周期内计数

如何根据R中其他变量的类别汇总值?

如何在PDF格式的kableExtra表格中显示管道字符?

R+reprex:在呈现R标记文件时创建可重现的示例

在使用具有Bray-Curtis相似性的pvCluust时计算p值

如何构建一个for循环来循环处理动物ID?

基于R中的辅助向量中的值有条件地连接向量中的字符串

根据用户输入更改标记大小和 colored颜色 (R)

为什么R列名称忽略具有指定名称的向量,而只关注索引?