【问题标题】:R identifying and aggregating balances with no historyR识别和汇总没有历史记录的余额
【发布时间】:2018-08-28 02:07:58
【问题描述】:

我有一组余额超过 4 个月的帐户。我想对那个特定月份刚刚出现的余额进行汇总。这是我到目前为止所得到的。

每个月创建一个(新)帐户。

Accounts <- c('A','B','C','A','B','C','A','B','C')
Dates <- as.Date(c('2016-01-31', '2016-01-31','2016-01-31','2016-02-28','2016-02-28','2016-02-28','2016-03-31','2016-03-31','2016-03-31'))
Balances <- c(100,NA,NA,90,50,NA,80,40,120)
Origination <- data.frame(Dates,Accounts,Balances)

library(reshape2)
Origination <- dcast(Origination,Dates ~ Accounts, value.var = "Balances")
Origination$Originated <- apply(Origination[2:4],1,function(x) ifelse(sum(is.na(x))==nrow(Origination),NA,tail(na.omit(x),1)))
Origination <- melt(Origination, id = c("Dates"))
Origination <-dcast(Origination, variable ~ Dates, value.var = "value")

    variable 2016-01-31 2016-02-29 2016-03-31
1          A        100         90         80
2          B         NA         50         40
3          C         NA         NA        120
4 Originated        100         50        120

这将创建一个原始表,其中包含名为 Originated 的行。第一个月我们只有 100,第二个月我们有摊销的 A 到 90,还有一个新帐户 50,上个月我们有摊销的 A 和 B,新的 C 为 120。原始列完全按照我的意愿捕获它。

但是,如果我在第 2 个月引入另一个帐户 D,它只会选择那个金额 (10),而不是两个帐户的总和。即 50 (B) 加上 10(C)。

Accounts <- c('A','B','C','D','A','B','C','D','A','B','C','D')
Dates <- as.Date(c('2016-01-31', '2016-01-31','2016-01-31','2016-01-31','2016-02-28','2016-02-28','2016-02-28','2016-02-28','2016-03-31','2016-03-31','2016-03-31','2016-03-31'))
Balances <- c(100,NA,NA,NA,90,50,10,NA,80,40,5,120)
Origination <- data.frame(Dates,Accounts,Balances)

library(reshape2)
Origination <- dcast(Origination,Dates ~ Accounts, value.var = "Balances")
Origination$Originated <- apply(Origination[2:4],1,function(x) ifelse(sum(is.na(x))==nrow(Origination),NA,tail(na.omit(x),1)))
Origination <- melt(Origination, id = c("Dates"))
Origination <-dcast(Origination, variable ~ Dates, value.var = "value")

    variable 2016-01-31 2016-02-28 2016-03-31
1          A        100         90         80
2          B         NA         50         40
3          C         NA         10          5
4          D         NA         NA        120
5 Originated        100         10          5

所以问题是,我如何跨日期对从 A 到 D 新添加的帐户求和。也许我想多了。我想要的结果是这样的:

    variable 2016-01-31 2016-02-28 2016-03-31
1          A        100         90         80
2          B         NA         50         40
3          C         NA         10          5
4          D         NA         NA        120
5 Originated        100         60        120

非常感谢您的帮助。 阿克塞尔

【问题讨论】:

  • 对于每个单独的 A:D 列,您可以通过仅采用滞后值为 NA 的值来解决。例如为 A.Origination$Originated_A &lt;- ifelse(is.na(dplyr::lag(Origination$A)), Origination$A, 0)。您只需要在 apply for all 中执行此操作并求和
  • 感谢您的指导,我的应用功能似乎有问题。我无法让它在日期列之后的 4 列上工作。该示例只是一个示例。我需要对大约 1000 个帐户进行计算。感谢您的耐心等待。

标签: r data.table reshape aggregation


【解决方案1】:

我终于找到了获得我想要的输出的方法。有兴趣的朋友可以参考一下。

sel <- rbind(FALSE, !is.na(head(Origination[-1], -1)))
#sel
#         A     B     C     D
#[1,] FALSE FALSE FALSE FALSE
#[2,]  TRUE FALSE FALSE FALSE
#[3,]  TRUE  TRUE  TRUE FALSE

rowSums(replace(Origination[-1], sel, 0), na.rm=TRUE)
#[1] 100  60 120

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-04
    • 1970-01-01
    • 2021-04-28
    • 1970-01-01
    • 1970-01-01
    • 2017-10-31
    • 1970-01-01
    相关资源
    最近更新 更多