我数据的简化结构如下:
>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;子句...
答案 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