换句话说,我想对一个列进行分组,然后仅使用每个组中的一些行来执行计算。
我拥有的数据集是:
LoanRefId Tran_Type TransactionAmount
103 11 LoanIssue 1000.0000
104 11 InitiationFee 171.0000
105 11 Interest 59.6729
106 11 AdministrationFee 64.9332
107 11 RaisedClientInstallment 1295.5757
108 11 ClientInstallment 1295.4700
109 11 PaidUp 0.0000
110 11 Adjustment 0.1361
111 11 PaidUp 0.0000
112 12 LoanIssue 3000.0000
113 12 InitiationFee 399.0000
114 12 Interest 94.9858
115 12 AdministrationFee 38.6975
116 12 RaisedClientInstallment 3532.6350
117 12 ClientInstallment 3532.6100
118 12 PaidUp 0.0000
119 12 Adjustment 0.0733
120 12 PaidUp 0.0000
我想为每个小组重复以下计算:
ClientInstallment
- LoanIssue
。
因此,第1组将为LoanRefId
编号11.计算将采用ClientInstallment
1295.47并减去1000 LoanIssue
给我一个新列,称之为“收入,价值295.47。
是否可以使用data.table
或dplyr
或任何其他聪明的技巧。
或者我可以创建两个数据摘要,一个用于Clientinstallment
,一个用于LoanIssue
,然后减去它们,但事实是我需要做的不仅仅是减去两个数字,所以我会需要每个计算的数据摘要,这只是简单的unclever imho。
感谢任何帮助
答案 0 :(得分:2)
我们可以使用data.table
。我们将'data.frame'转换为'data.table'(setDT(df1)
),按'LoanRefId'分组,我们得到'Tran_Type''ClientInstallment'和'LoanIssue'的相应'TransactionAmount'然后减去它。
library(data.table)
setDT(df1)[,list(Income =TransactionAmount[Tran_Type=='ClientInstallment']-
TransactionAmount[Tran_Type=='LoanIssue']), by = LoanRefId]
# LoanRefId Income
#1: 11 295.47
#2: 12 532.61
我们也可以使用类似appraoch的dplyr
df1 %>%
group_by(LoanRefId) %>%
summarise(Income = TransactionAmount[Tran_Type=='ClientInstallment']-
TransactionAmount[Tran_Type=='LoanIssue'])
如果我们没有“LoanRefId”的“ClientInstallment”或“LoanIssue”,我们可以使用if/else
条件
setDT(df1)[, list(Income= if(any(Tran_Type=='ClientInstallment') &
any(Tran_Type=='LoanIssue'))
TransactionAmount[Tran_Type=='ClientInstallment'] -
TransactionAmount[Tran_Type=='LoanIssue'] else 0 ), by = LoanRefId]