【问题标题】:R - Calculating a Running Total Between Different Time IntervalsR - 计算不同时间间隔之间的运行总计
【发布时间】:2018-08-14 19:33:20
【问题描述】:

我有一个跟踪一些贷款余额的数据框。每次向余额(“金额”)付款时,该物业贷款的新余额都会显示在“余额”列中。

df = data.frame(Date = c("2015-03-01", "2015-05-01", "2016-07-02", "2017-11-24", "2017-12-15"),
            Property = c("1 Main St", "1 Main St", "1 Main St", "5 Main St", "1 Main St"),
            Amount = c(50000, -10000, -5000, 75000, -4000),
            Balance = c(50000, 40000, 35000, 75000, 31000)
            )

如您所见,日期相当分散,大多数月份没有任何交易记录。我希望能够在每个月初制作一个包含每个属性余额的数据框,无论当月是否有交易。像这样的:

Month = c("March 2015", "April 2015", "May 2015", "June 2015"),
Property = c("1 Main St", "1 Main St", "1 Main St", "1 Main St").
Balance = c(50000, 50000, 40000, 40000)

它还需要能够处理当月的最后一笔交易(如果在给定的月份内有多个房产交易)。任何想法如何处理这个?

【问题讨论】:

    标签: r


    【解决方案1】:

    首先,确保您的Date 字段的类型为“日期”。这是我用来处理你的数据的调用:

    df = data.frame(Date = as.Date(c("2015-03-01", "2015-05-01", "2016-07-02", "2017-11-24", "2017-12-15"), "%Y-%m-%d"),
                Property = c("1 Main St", "1 Main St", "1 Main St", "5 Main St", "1 Main St"),
                Amount = c(50000, -10000, -5000, 75000, -4000),
                Balance = c(50000, 40000, 35000, 75000, 31000),
                stringsAsFactors = FALSE
                )
    

    注意,我还在 data.frame 调用中添加了 stringsAsFactors = FALSE 参数。

    然后,我使用以下代码也许(?)回答了您的问题:

    library(tidyr)
    library(dplyr)
    library(lubridate)
    
    arrange(df, Date)
    
    from <- first(df$Date)
    to <- last(df$Date)
    
    new_df <- df %>%
            complete(Date = seq.Date(from, to, "day"))%>%
            fill(Property:Balance)%>%
            group_by(year = year(Date), month=month(Date, label = TRUE), Property)%>%
            summarise(Balance = last(Balance))
    

    【讨论】:

    • 它适用于从“开始”日期开始的属性。但是,即使在初始化贷款后,第二个属性也只能获得 NAs 作为余额。知道为什么吗?
    • 没关系,我知道为什么了。第一行和最后一行取第一行和最后一行(我假设它取的是最小值/最大值)。我的 DF 没有排序,所以一旦我对它进行排序,就很好了。非常感谢您的帮助!
    • @D.Bryant,我通过包含arrange() 编辑了答案,以便在获取第一个和最后一个值之前对df 进行排序。如果我回答了您的问题,请随时检查复选标记,以便其他人可以看到问题有答案。
    • 完成。再次感谢您回答我的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-16
    • 2021-07-20
    • 2016-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多