使用 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
我的数据的简化结构如下:
>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