如何查找期初和期末余额

问题描述 投票:1回答:2

有人可以帮我找到opening_baland closing_bal。我拥有本月发生的所有交易总量(新/转账/退出等),我也有上个月的期末余额。使用这些数据我需要回过头来。

library(tidyverse)
library(lubridate)

# this is the data and closing balance detail I have
df <- data.frame(stringsAsFactors=FALSE,
         placement_status_type = c("opening_bal", "New", "Transfer", "Reinstated",
                                   "Suspended", "Exit", "closing_bal"),
                       sep2018 = c(NA, 97, -40, 164, -221, -170, NA),
                       oct2018 = c(NA, 96, -40, 173, -208, -208, NA),
                       nov2018 = c(NA, 101, -36, 162, -206, -158, NA),
                       dec2018 = c(NA, 76, -27, 146, -128, -143, NA),
                       jan2019 = c(NA, 117, -23, 139, -168, -167, NA),
                       feb2019 = c(NA, 124, -39, 135, -156, -158, NA),
                       mar2019 = c(NA, 70, -18, 103, -173, -115, NA)
      )



mar2019_closing_bal <- 1000


# This is the output I am looking for
df_output <- data.frame(stringsAsFactors=FALSE,
                placement_status_type = c("opening_bal", "New", "Transfer", "Reinstated",
                                          "Suspended", "Exit", "closing_bal"),
                              sep2018 = c(1899, 97, -40, 164, -221, -170, 1729),
                              oct2018 = c(1729, 96, -40, 173, -208, -208, 1542),
                              nov2018 = c(1542, 101, -36, 162, -206, -158, 1405),
                              dec2018 = c(1405, 76, -27, 146, -128, -143, 1329),
                              jan2019 = c(1329, 117, -23, 139, -168, -167, 1227),
                              feb2019 = c(1227, 124, -39, 135, -156, -158, 1133),
                              mar2019 = c(1133, 70, -18, 103, -173, -115, 1000)
             )

有任何想法吗?

r tidyverse
2个回答
2
投票

这可以在没有使用cumsum的循环的情况下完成。由于你有最终余额并且想要向后工作,我们需要反转列,取出cumsum,从最终余额中减去,然后再反转它以得到原始顺序的东西。

df[1,-1] = rev(mar2019_closing_bal - cumsum(rev(colSums(df[-c(1,7),-1]))))
df[7,-1] = c(df[1,-(1:2)], mar2019_closing_bal)

df
  placement_status_type sep2018 oct2018 nov2018 dec2018 jan2019 feb2019 mar2019
1           opening_bal    1899    1729    1542    1405    1329    1227    1133
2                   New      97      96     101      76     117     124      70
3              Transfer     -40     -40     -36     -27     -23     -39     -18
4            Reinstated     164     173     162     146     139     135     103
5             Suspended    -221    -208    -206    -128    -168    -156    -173
6                  Exit    -170    -208    -158    -143    -167    -158    -115
7           closing_bal    1729    1542    1405    1329    1227    1133    1000

1
投票

这可以在for循环中完成,这是一个非常简单的forloop,可以很容易地编码成c ++或任何语言。因此,如果你想把它扩展到一个桌子上的怪物,也许可以考虑一下。但出于合理的目的,这应该很好。

df[nrow(df), ncol(df)] <- 1000 # Just putting in the known closing balance
for(j in ncol(df):2){
  for(i in nrow(df):1){
    if (i == 1) {
      df[i, j] <- df[nrow(df), j] - sum(df[2:6, j])    
    }
    if(i == nrow(df) & is.na(df[i, j])){
      df[i, j] <- df[1, j + 1]
    }
  }
}

> df
  placement_status_type sep2018 oct2018 nov2018 dec2018 jan2019 feb2019 mar2019
1           opening_bal    1899    1729    1542    1405    1329    1227    1133
2                   New      97      96     101      76     117     124      70
3              Transfer     -40     -40     -36     -27     -23     -39     -18
4            Reinstated     164     173     162     146     139     135     103
5             Suspended    -221    -208    -206    -128    -168    -156    -173
6                  Exit    -170    -208    -158    -143    -167    -158    -115
7           closing_bal    1729    1542    1405    1329    1227    1133    1000
© www.soinside.com 2019 - 2024. All rights reserved.