【问题标题】:Value sum with previous与先前的值总和
【发布时间】:2019-09-02 14:50:35
【问题描述】:

我想创建一个新列,Z,值是用以前计算的。
我将在下面解释。

这是伪数据:

#dt
     C         P
  8.5%  100.9063
13.13%  105.9961
15.75%  112.4102
  7.5%  101.2188 

我想要的是:

     C         P            Z
  8.5%  100.9063   0.96792566
13.13%  105.9961   0.93507648   
15.75%  112.4102   0.90311943
  7.5%  101.2188   0.87417633

第一个值 0.96792566 由 P/(100*(1+C/2))100.9063/(100*(1+8.5%/2)) 计算得出。
倒数第二个由(P-(C/2)*100*SUM(Z))/((1+C/2)*100)计算,其中Z在这个公式中是添加到前一个。
我从 excel 的角度编写了这些公式。
例如,

`0.93507648 = (105.9961-(13.13%/2)*100*SUM(0.96792566))/((1+13.13%/2)*100)`
`0.90311943 = (112.4102-(15.75%/2)*100*SUM(0.96792566, 0.93507648))/((1+ 15.75%/2)*100)`

有什么建议吗?

【问题讨论】:

  • 很抱歉造成混淆。这些公式来自excel的观点。这是我的难点,我可以在 excel 中计算出我想要的东西,但在 R 中我该怎么做。
  • 我添加了我在 excel 中的操作截图。这样就说明问题了吗?
  • 第一个不需要sum。在 R 中,我认为应该是 P/(100*(1+C/2))。但是,我不知道还有一个。
  • 我搜索了滚动和cumsum,但仍然不知道

标签: r data.table data-manipulation


【解决方案1】:

我们可能需要在for 循环中递归更新

library(readr)
v1 <- numeric(nrow(dt))
v1[1] <- dt$P[1]/(100*(1+parse_number(dt$C[1])/100/2))    
C <- parse_number(dt$C)/100 
for(i in 2:nrow(dt))  v1[i] <- (dt$P[i]-(C[i]/2)*100* sum(v1[1:(i-1)]))/((1+C[i]/2)*100)
dt$Z <- v1
dt$Z
#[1] 0.9679257 0.9350318 0.9031231 0.8741783

数据

dt <- structure(list(C = c("8.5%", "13.13%", "15.75%", "7.5%"), P = c(100.9063, 
105.9961, 112.4102, 101.2188)), class = "data.frame", row.names = c(NA, 
-4L))

【讨论】:

  • 我的问题不在于百分比。它实际上显示了 R 中的数值。问题是第二个公式...
  • “不同”是什么意思?
  • @PeterChen 你现在可以检查输出了吗
  • 它有效。惊人的。但是,如果数据很大,是否可以避免循环过程?
  • @PeterChen 通常的方式是Reduceaccumulate = TRUEaccumulate,来自purrr,但这里的输入取决于多个列值,这使得这样做很棘手
猜你喜欢
  • 1970-01-01
  • 2021-02-18
  • 2016-07-02
  • 1970-01-01
  • 2012-01-03
  • 1970-01-01
  • 1970-01-01
  • 2016-07-30
  • 1970-01-01
相关资源
最近更新 更多