使用应用于列表的R计算边际税率

时间:2018-11-13 22:44:21

标签: r

我正在使用O'Brien的方法来解决此问题:

Calculate marginal tax rates using R

我正在尝试应用基本公式

> sum(diff(c(0, pmin(income, brackets))) * rates)

从奥布莱恩函数开始:

income_tax <- 
function(income,
         brackets = c(18200, 37000, 80000, 180000, Inf),
         rates = c(0, .19, .325, .37, .45)) {        
    sum(diff(c(0, pmin(income, brackets))) * rates)
}

到列表:

income <- c(16000, 45000, 200000, 150000)

我收到以下警告:

  

警告消息:1:在pmin()中:一个   参数将被部分回收2:在diff()中:更长   对象长度不是较短对象长度的倍数

伴随着收入列表中最后一个元素的输出

预期输出也是通过基本公式计算出的税额列表

有人能指出我正确的方向吗?还是有一种更优雅的方式来解决这个问题?

1 个答案:

答案 0 :(得分:0)

这是一个古老的问题,但是我也遇到了这个问题,我想分享我的解决方案,以防将来任何人需要它。

原始函数适用于标量而不是矢量。这是因为pmin函数将income输入视为与bracket向量具有相同长度的向量,并返回并行最小值。

将函数应用于收入向量的一种方法是使用sapply

income <- c(16000, 45000, 200000, 150000)

sapply(income, income_tax)

# [1] 0  6172 63547 43447

如果使用dplyr在数据框中应用该功能,则可以使用rowwise()

y <- data.frame(income = c(16000, 45000, 200000, 150000))
y %>% rowwise() %>% mutate(tax = income_tax(income))

# income   tax
# <dbl> <dbl>
# 1  16000     0
# 2  45000  6172
# 3 200000 63547
# 4 150000 43447