【问题标题】:R solving circular referenceR解决循环引用
【发布时间】:2018-03-06 05:27:05
【问题描述】:

我在 Excel 中使用了一个公式,它只有在启用迭代计算后才能给出正确的结果。

如何解决R中的这个迭代问题?

【问题讨论】:

  • 请发布您到目前为止尝试过的内容,以及为什么它不起作用。
  • ` for(i in 2: nrow(ecltable)){ # ecltable$intpayment[i-1]
  • 这是一个简单的公式,只是复制了 Excel 公式。它给出了一些奇怪的结果。我可以使用 itersolve 函数来解决这个问题吗?
  • 如果您提供了可重现的示例,会更容易为您提供帮助,请参见例如here

标签: r excel circular-reference


【解决方案1】:

也许是这样的?

dat <- data.frame(
  indicator = rep(c(1,0,0), times = 4),
  interest = c(0,54,33,678,987,544,321,345,678,907,567,0)
)

intersolve <- function(indicator, interest){
  indicators = rev(cumsum(rev(indicator) == 1))
  sums = rev(tapply(interest, indicators, sum))
  interest_payment = rep(sums[-1], each = 3) * indicator
  return(interest_payment)
}

dat$interest_payment = intersolve(indicator = dat$indicator, interest = dat$interest)
dat

#    indicator interest interest_payment
# 1          1        0              765
# 2          0       54                0
# 3          0       33                0
# 4          1      678             1852
# 5          0      987                0
# 6          0      544                0
# 7          1      321             1930
# 8          0      345                0
# 9          0      678                0
# 10         1      907              567
# 11         0      567                0
# 12         0        0                0

编辑

以下函数自动检测 1 的模式。

intersolve2 <- function(indicator, interest){
  n = length(interest)
  indicators = rev(cumsum(rev(indicator) == 1))
  sums = rev(tapply(interest, indicators, sum))
  lens = rev(table(indicators))[-1]
  lens[length(lens)] = lens[length(lens)] + 1
  interest_payment = rep(sums[-1], times = lens) * indicator
  if (indicator[n] == 1){interest_payment[n]=interest[n]}
  return(interest_payment)
}

【讨论】:

  • 谢谢,但它似乎只能解决给定类型的问题。假设指标不是给定的方式(例如,所有指标都是 1 或者说它有 20 行 1,0,0,0,0,0,1,0,0,0,0,0,1,0, 0,0,0,0,1,0 或其他一些时尚。它不起作用
  • 我的第一个解决方案只解决了给定类型的问题,因为您想要做的事情不清楚并且您没有提供额外的上下文。也许intersolve2() 会解决你的问题。 :)
猜你喜欢
  • 1970-01-01
  • 2011-10-19
  • 1970-01-01
  • 1970-01-01
  • 2011-02-13
  • 1970-01-01
  • 1970-01-01
  • 2011-05-15
  • 1970-01-01
相关资源
最近更新 更多