首页 > 解决方案 > 计算R中每月的记录数

问题描述

给定商户 ID、卡号和日期,我需要计算每个月与每个商户 ID 关联的卡号数量。到目前为止,我只能计算每个商家 ID 的卡号数量,但我无法使用以下代码每月计算它:

HitsCounter <- summarise(group_by(df, MerchantID), HitsTotal = n_distinct(CardNum))

可重现的数据:

MerchantID <- c('1234, '1234', '1234', '1234')
CardNum <- c('1abc1', '1abc1', '2xyz2', '3ijk3')
Date <- c('2020-05-07', '2020-05-07', '2019-10-12', '2019-10-25')
df <- data.frame(MerchantID, CardNum, Date)

当我将 HitsCounter 合并到我的数据框 df 时得到什么:

MerchantID  CardNum     Date        HitsTotal
  1234       1abc1   2020-05-07         3
  1234       1abc1   2020-05-07         3
  1234       2xyz2   2019-10-12         3
  1234       3ijk3   2019-10-25         3
 

预期输出数据:

MerchantID  CardNum     Date        HitsPerMonth
  1234       1abc1   2020-05-07          2
  1234       1abc1   2020-02-07          1
  1234       2xyz2   2020-05-12          2
  1234       3ijk3   2019-10-25          1
  1234       3ijk3   2019-10-01          1      

请注意,即使在不同月份,逻辑也应完全忽略任何重复的 CardNumber,因为每个唯一 CardNumber 都会计算“命中”。

简单来说,它应该回答一个问题:

同一个Merchant ID在同一个月内交易了多少个Unique Card Number?

标签: rdataframedplyrdata-analysis

解决方案


您可以从 date 中提取年月值并计算每个和的唯一CardNum值。MerchantIDmonth

library(dplyr)

df %>%
  mutate(Date = as.Date(Date), 
         month = format(Date, "%Y-%m")) %>%
  group_by(MerchantID, month) %>%
  mutate(HitsPerMonth = n_distinct(CardNum))

如果 a必须为每个月CardNum只计算一次,那么您可以执行以下操作:MerchantID

df %>%
  mutate(Date = as.Date(Date), 
         month = format(Date, "%Y-%m")) %>%
  group_by(MerchantID) %>%
  mutate(CardNum = replace(CardNum, duplicated(CardNum), NA)) %>%
  group_by(month, .add  =TRUE) %>%
  mutate(HitsPerMonth = n_distinct(na.omit(CardNum)))

推荐阅读