R函数值到数据帧

R函数值到数据帧,r,R,我正在构建这个函数 f <- function(x) { bruto <- x*1.289 LC <- bruto*1.0124 npd <- max(470 - 0.16*max(0,(bruto - 600)),0) lubos <- 5*850*1.289*1.05^3 tax_base <- max(0,(bruto-npd)) gpm <- ifel

我正在构建这个函数

f <- function(x) {
        bruto <- x*1.289
        LC <- bruto*1.0124
        npd <- max(470 - 0.16*max(0,(bruto - 600)),0)
        lubos <- 5*850*1.289*1.05^3
        tax_base <- max(0,(bruto-npd))
        gpm <- ifelse(bruto<=lubos, tax_base*0.21, lubos *0.21+(bruto-lubos)*0.25) 
        sodra <- min(max(bruto*0.185, 600*0.185), lubos * 0.185)
        db <- bruto*0.0124
        neto <- bruto - gpm - sodra
        list(old_bruto=x, new_bruto=bruto, npd=npd, gpm = gpm, sodra = sodra, neto = neto, ITR=((LC-neto)/LC))
}
如果我输入f400等单个值,它会给出正确的结果,但是如果我尝试

x <- seq(100, 25000, by=10)
df <- f(x)
df <- data.frame(old_bruto=df$old_bruto, ITR=df$ITR)
它给了我非常奇怪的结果,比如f100的结果应该是ITR=0.86,而df的结果是ITR100=20.99

有人能告诉你,我错在哪里吗?
谢谢

一个问题可能是您使用的是min和max,这将只返回一个数字。当你对事物进行矢量化时,你需要它们返回向量的分段最大值

输入pmin和pmax:

请尝试此版本:

f <- function(x) {
        bruto <- x*1.289
        LC <- bruto*1.0124
        npd <- pmax(470 - 0.16*pmax(0,(bruto - 600)),0)
        lubos <- 5*850*1.289*1.05^3
        tax_base <- max(0,(bruto-npd))
        gpm <- ifelse(bruto<=lubos, tax_base*0.21, lubos *0.21+(bruto-lubos)*0.25) 
        sodra <- pmin(pmax(bruto*0.185, 600*0.185), lubos * 0.185)
        db <- bruto*0.0124
        neto <- bruto - gpm - sodra
        list(old_bruto=x, new_bruto=bruto, npd=npd, gpm = gpm, sodra = sodra, neto = neto, ITR=((LC-neto)/LC))
}

f(c(100,101))
# $old_bruto
# [1] 100 101
# $new_bruto
# [1] 128.900 130.189
# $npd
# [1] 470 470
# $gpm
# [1] 0 0
# $sodra
# [1] 111 111
# $neto
# [1] 17.900 19.189
# $ITR
# [1] 0.8628335 0.8544119

我不知道ITR100怎么可能是任何东西。在您的代码中,ITR不是一个函数。请使用pmin和pmax对向量的所有元素进行比较。@Yannisvasiliadis将其作为答案发布。
f <- function(x) {
        bruto <- x*1.289
        LC <- bruto*1.0124
        npd <- pmax(470 - 0.16*pmax(0,(bruto - 600)),0)
        lubos <- 5*850*1.289*1.05^3
        tax_base <- max(0,(bruto-npd))
        gpm <- ifelse(bruto<=lubos, tax_base*0.21, lubos *0.21+(bruto-lubos)*0.25) 
        sodra <- pmin(pmax(bruto*0.185, 600*0.185), lubos * 0.185)
        db <- bruto*0.0124
        neto <- bruto - gpm - sodra
        list(old_bruto=x, new_bruto=bruto, npd=npd, gpm = gpm, sodra = sodra, neto = neto, ITR=((LC-neto)/LC))
}

f(c(100,101))
# $old_bruto
# [1] 100 101
# $new_bruto
# [1] 128.900 130.189
# $npd
# [1] 470 470
# $gpm
# [1] 0 0
# $sodra
# [1] 111 111
# $neto
# [1] 17.900 19.189
# $ITR
# [1] 0.8628335 0.8544119