我有这样的数据。
Date CIFNO POS POS CITY NO OF TXNS TXN.AMOUNT
1/5/2015 12000 Billdesk.com_ CRET 6 8,681.0
3/21/2014 12000 MTNL-BILLDESK MUMBAI 1 556.0
2/1/2015 13000 bookmyshow CRET 1 1,134.8
10/15/2013 12000 LUCKY LUCKNOW 1 5,150.0
9/23/2015 13000 BASE PVT KOLKATA 1 3,505.0
我需要对每个CIF的交易和交易金额进行总结。此外,我还需要为每个CIF保留POS交易的最新日期以及相应的POS和POS城市。基本上,我需要获得这样的输出:
Date CIFNO POS POS CITY NO OF TXNS TXN.AMOUNT
1/5/2015 12000 Billdesk.com_ CRET 8 14,387.00
9/23/2015 13000 BASE PVT KOLKATA 2 4,639.8
这不会增加CIF 12000和13000的交易和trxn金额。它还需要最新的POS交易日期(CIF 12000的1/5/2015和CIF 13000的9/23/2015)并获得相应的POS和POS CITY了解每个CIF的最新日期。有人可以帮我这个吗?非常感谢。
答案 0 :(得分:2)
您可以使用data.table
。以下语法为您提供所需的结果。
library(data.table)
setDT(df)
df[, Date := as.Date(strptime(as.character(Date),"%m/%d/%Y"))]
df[, TXN.AMOUNT := as.numeric(gsub(",","", TXN.AMOUNT))]
res <- df[order(-Date), .(Date=Date[1L],
POS=POS[1L],
POS.CITY=POS.CITY[1L],
NO.OF.TXNS=sum(NO.OF.TXNS),
TXN.AMOUNT=sum(TXN.AMOUNT)),
by = CIFNO]
setcolorder(res, c(2:1, 3:6))
我们得到以下结果:
res
## Date CIFNO POS POS.CITY NO.OF.TXNS TXN.AMOUNT
## 1: 2015-09-23 13000 BASE.PVT KOLKATA 2 4639.8
## 2: 2015-01-05 12000 Billdesk.com_ CRET 8 14387.0
或更强大的解决方案
cols <- grep("TXN", names(df), value = TRUE)
df[order(Date), c(lapply(.SD[, cols, with = FALSE], sum),
lapply(.SD[, setdiff(names(.SD), cols), with = FALSE], last)),
by = CIFNO]
## CIFNO NO.OF.TXNS TXN.AMOUNT Date POS POS.CITY
## 1: 12000 8 14387.0 2015-01-05 Billdesk.com_ CRET
## 2: 13000 2 4639.8 2015-09-23 BASE PVT KOLKATA
答案 1 :(得分:1)
使用dplyr
即可:
library(dplyr)
data$TXN.AMOUNT<-as.numeric(gsub(",","", data$TXN.AMOUNT))
data$Date <- as.Date(strptime(as.character(data$Date),"%m/%d/%Y"))
data%>% group_by(CIFNO) %>% arrange(Date) %>% summarise(Date=last(Date),
POS=last(POS),
POS.CITY=last(POS.CITY),
TXN.AMOUNT=sum(TXN.AMOUNT),
NO.OF.TXNS=sum(NO.OF.TXNS))
你得到:
CIFNO Date POS POS.CITY TXN.AMOUNT NO.OF.TXNS
1 12000 2015-01-05 Billdesk.com_ CRET 14387.0 8
2 13000 2015-09-23 BASE_PVT KOLKATA 4639.8 2