mutate()中的dplyr lag()用于向前滚动值

时间:2015-11-18 19:53:06

标签: r data.table dplyr

我正在尝试使用dplyr的{​​{1}}和mutate()来推送值。我正在尝试以下代码使其工作。而不是像我期望的那样工作,我在第一行之后的lag()列中得到ZERO。我尝试使用BegFund没有运气,data.table shift()也没有运气。有人有什么想法吗?

以下是我正在尝试做的简化示例。我测试时再现。

stats::lag()

编辑:下面是我想从R中获取的输出。请原谅糟糕的格式,我对此非常陌生。

library(dplyr) #  0.4.3

payments <- 1:10
fund.start <- 1000
payment.percent <- .05

fund.value <- data.frame(payments)

fund.value <- fund.value %>%
  transmute(Payment = payments) %>%
  mutate(EndFund = 0) %>%
  mutate(BegFund = ifelse(Payment == 1, fund.start, lag(EndFund, 1)),
         PmtAmt = BegFund * payment.percent,
         EndFund = BegFund - PmtAmt) %>%
  select(Payment, BegFund, PmtAmt, EndFund)
head(fund.value)

2 个答案:

答案 0 :(得分:1)

以这种方式:

EndFund = fund.start * (1 - payment.percent) * (1-payment.percent)^(payments-1L)
BegFund = c(fund.start, head(EndFund, -1L))
PymtAmt = BegFund - EndFund

注意到@Eddi也在评论中对此进行了报道。

答案 1 :(得分:0)

我知道这不是OP想要的方式,但它可能有所帮助

fund.value <- data.frame(payments, BegFund=0, PmtAmt=0,EndFund=0)

fund.value$BegFund[1]<-fund.start
fund.value$PmtAmt[1] = fund.value$BegFund[1] * payment.percent
fund.value$EndFund[1] = fund.value$BegFund[1] - fund.value$PmtAmt[1]

for(i in 2:dim(fund.value)[1]){
  fund.value$BegFund[i]<-fund.value$EndFund[i-1]
  fund.value$PmtAmt[i] = fund.value$BegFund[i] * payment.percent
  fund.value$EndFund[i] = fund.value$BegFund[i] - fund.value$PmtAmt[i]
}  

Out is

  payments   BegFund   PmtAmt  EndFund
1        1 1000.0000 50.00000 950.0000
2        2  950.0000 47.50000 902.5000
3        3  902.5000 45.12500 857.3750
4        4  857.3750 42.86875 814.5063
5        5  814.5063 40.72531 773.7809
6        6  773.7809 38.68905 735.0919