使用dplyr mutate()合同期限,付款计数和总支出

时间:2015-02-23 19:05:18

标签: r timestamp time-series dplyr

我数据的简化结构如下:

>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

实际数据的结构,涵盖18个合同的1860个合约,在18个地点超过15年(不定期,每日系列):

> 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库之前,我使用SQL查询来构建$MonthCount变量(感谢DataCamp),现在想知道:

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

1)&#34;合同长度&#34; :获取给定合约Date上最后一笔付款和第一笔付款的ID之间的差额并返回numeric类型。

2)&#34;合同付款计数&#34; :计算在给定合同ID上支付的金额(大概超过Contract Length)。假设非零付款,这应该是ID在该列中出现的次数。

3)&#34;合同付款总额&#34; :对给定Amt的每笔付款的ID求和,(再次,大概是在实现中)我打电话给Contract Length)。

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

编辑:

刚拿到dplyr后,我正在使用E1 <- mutate(E, ContractLength = max(Date) - min(Date))小费#1,但这会返回一个“9天”的列。因为我没有正确识别每个ID&#39;子句...

2 个答案:

答案 0 :(得分:2)

我认为这应该提供你想要的东西。

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 :(得分:1)

这应该让你开始#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