此代码有什么问题?我必须加2才能找出原始答案?

时间:2019-09-15 12:29:18

标签: r for-loop statistics append finance

我想使用 R 找出投资回收期。因此,我遵循了一个python代码,并尝试将其转到R。但是,我得到的答案总是比正确答案小2。

我尝试添加2,这只是一个简单的技巧。但是,主要问题仍然存在。

cashInflows     <-  data.frame( 
    Year        =   c(1, 2, 3, 4, 5), 
    ProjectA    =   c(10000, 20000, 30000, 40000, 20000), 
    ProjectB    =   c(40000, 30000, 20000, 10000, 20000)
    ) 
total       =   0
years       =   0
cumulative  <-  c()

for (f in cashInflows$ProjectB){
    total       =   f + total
    if (total   < cashOutflows){
        years = years + 1
    cumulative <-   append(cumulative, total)
   }
}

A  <- years - 1
B  <- cashOutflows - cumulative[years]
C  <- cashInflows$ProjectB[years + 2] # Why +2 ???????? ( I don't know specifically yet.)
print (A + (B/C))

1 个答案:

答案 0 :(得分:1)

这里是一些经过修改的工作代码。

1)正如其他人所指出的那样,您需要在某个位置定义cashOutflows以便运行。

2)R使用基于1的索引,因此,如果您有访问矢量第0个索引的代码,您将无法获得预期的结果。我将years更改为以1开头,这样,如果永不调用递增循环(即我们在1年内通过损益平衡),我们将获得一个有效数字(0)而不是NULL。

我已将代码放入名为test的函数中,该函数以cashOutflows作为输入。

total       =   0
years       =   1
cumulative  <-  0

test <- function(cashOutflows) {
  for (f in cashInflows$ProjectB){
    total       =   f + total
    if (total   < cashOutflows){
      years = years + 1
      cumulative <-   append(cumulative, total)
    }
  }

  A  <- years - 1
  B  <- cashOutflows - cumulative[years]
  C  <- cashInflows$ProjectB[years] 
  return (A + (B/C))
}

然后我们可以使用一些输入来尝试使用此功能,从而产生我期望的输出:

> as.numeric(lapply(c(20000, 39999, 40000, 40001, 70000, 80000), test))
[1] 0.500000 0.999975 1.000000 1.000033 2.000000 2.500000

这告诉我们,当我们向test中投放20k时,我们得到0.5,因为这是第一年40k流入的一半。当我们将39.999k输入该函数时,我们获得了0.9999年的收支平衡时间,因为我们不需要整整40k的一年才能达到收支平衡。


可以说,下面的方法对于R来说更惯用了,我们使用内置的矢量化函数,例如cumsum

cashOutflows <- 70000
output <- cashInflows
output$cuml = cumsum(output$ProjectB)       # Add column with cumulative total
output$excess = output$cuml - cashOutflows  # Calc "excess" over breakeven
output <- subset(output, excess >= 0)[1, ]  # Select first year at or beyond breakeven
output$Breakeven = output$Year - output$excess/output$ProjectB
output$Breakeven