在R中添加行并查找特定列值的最新日期

在R中添加行并查找特定列值的最新日期,r,R,我有这样的数据 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

我有这样的数据

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为2015年1月5日,CIF 13000为2015年9月23日),并获取每个CIF的最新日期对应的POS和POS城市。谁能帮我一下吗?非常感谢。

您可以使用
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))

还是一个更稳健的解决方案

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

cols使用
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))

谢谢你,大卫!你的语法很棒。请注意,我已将Date定义为'Date'类型。好的,添加了一个更健壮的解决方案(我相信)。感谢您的解决方案,但这些解决方案似乎都不适合我。第一个解决方案有很多错误。当我尝试使用第二个解决方案(健壮的解决方案)时,它正在删除日期和其他列..我不知道哪里出错..我是R的新手..请帮助..您可能对群集的名称和数据类型有问题。见str(df)。您的“交易”类型是否为“fector”?它们不应该是,它们需要是num或int…谢谢,我检查了数据类型问题,然后在您的帮助下进行了排序。但是,我得到的价值并不是我想要的。提取的日期是错误的,金额也是错误的。请让我知道我能做些什么来解决这个问题。非常感谢。你的解决方案对我有效。再次感谢。
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