R对行的子集执行组计算

时间:2015-11-13 10:00:03

标签: r data.table dplyr

换句话说,我想对一个列进行分组,然后仅使用每个组中的一些行来执行计算。

我拥有的数据集是:

    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.tabledplyr或任何其他聪明的技巧。

或者我可以创建两个数据摘要,一个用于Clientinstallment,一个用于LoanIssue,然后减去它们,但事实是我需要做的不仅仅是减去两个数字,所以我会需要每个计算的数据摘要,这只是简单的unclever imho。

感谢任何帮助

1 个答案:

答案 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]