使用 dplyr 来 mutate() 合同期限、付款次数和总支出

Using dplyr to mutate() contract duration, payment counts, and total payout

我的数据的简化结构如下:

>ID <- c("A", "B", "B", "C", "A", "B", "C", "C", "A", "B")
>Date = seq(as.Date("2000/07/01"), as.Date("2000/07/10"), "days")
>Amt <- rnorm(10, 10, 3)

>E <- data.frame(Date = Date, ID = ID, Amt = Amt)
>E
         Date ID  Amt
1  2000-07-01  A  5.9
2  2000-07-02  B  8.2
3  2000-07-03  B  5.2
4  2000-07-04  C 16.0
5  2000-07-05  A  9.6
6  2000-07-06  B  7.8
7  2000-07-07  C  9.3
8  2000-07-08  C  9.8
9  2000-07-09  A 10.0
10 2000-07-10  B 12.0

实际数据的结构,涵盖 15 年来在 1830 个地点的 1864 份合约的 14,460 笔付款(不规则间隔的每日系列):

> str(exp)
'data.frame':   14460 obs. of  14 variables (not all shown):
 $ ID            : Factor w/ 1864 levels "C10677","C10717"... 
 $ Loc           : Factor w/ 1830 levels "(BLANK CREEK BRIDGE)" ...
 $ Year          : int  2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 ...
 $ Month         : int  7 7 7 7 7 7 7 7 7 7 ...
 $ Day           : int  5 6 6 7 11 11 12 16 16 16 ...
 $ MonthCount    : int  20 20 20 20 20 20 20 20 20 20 ...
 $ MonthTotal    : num  10140428 10140428 10140428 10140428 10140428 ...
 $ Date          : Date, format: "2000-07-05" "2000-07-06" "2000-07-06"...

我的目标是实现数据摄取任务的自动化,以构建将存在于 ShinyR 应用程序(遥远的未来)中的预算预测。在我更好地熟悉 dplyr 库(感谢 DataCamp)之前,我使用 SQL 查询来构建 $MonthCount 变量,现在想知道:

使用 dplyr 库来(改变?)以下功能的最有效方法是什么:

1) "Contract Length":计算给定合同 ID 和 returns一个numeric类型。

2) "Contract Payment Count":计算给定合同 ID 的付款次数(大概超过 Contract Length)。假设非零付款,这应该 = ID 在该列中出现的次数。

3) "Contract Payment Total":将对给定 ID 的每笔付款的 Amt 求和(同样,大概超过了实现我打电话给 Contract Length)。

我认为单个 mutate() 调用能够处理所有这三个功能的创建是否正确?

编辑:

刚拿起 dplyr,我正在用 E1 <- mutate(E, ContractLength = max(Date) - min(Date)) 削减 #1,但是这个 returns 一列“9 天”,因为我没有正确识别 'for each ID' 条款...

我想这应该能提供你想要的。

E %>%
  group_by(ID) %>% 
  summarise(contract_len = as.numeric(difftime(last(Date), first(Date), unit="days")),
         num_payments = n(),
         payment = sum(Amt))

  ID contract_len num_payments  payment
1  A            8            3 26.64588
2  B            8            4 47.79380
3  C            4            3 27.79909

这应该让您从 #1 和 #2 开始 - 我认为您正在努力解决的是首先需要总结,然后需要变异?

contract_stats <- E %>%
  group_by(ID) %>%
  summarize(
    min_date=min(Date),
    max_date=max(Date),
    contract_count=n()
  ) %>%
  mutate(
    length = max_date - min_date  
  )

contract_stats
Source: local data frame [3 x 5]

  ID   min_date   max_date contract_count length
1  A 2000-07-01 2000-07-09              3 8 days
2  B 2000-07-02 2000-07-10              4 8 days
3  C 2000-07-04 2000-07-08              3 4 days