我正在使用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()中:更长 对象长度不是较短对象长度的倍数
伴随着收入列表中最后一个元素的输出
预期输出也是通过基本公式计算出的税额列表
有人能指出我正确的方向吗?还是有一种更优雅的方式来解决这个问题?
答案 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