【问题标题】:Count the number of records per month in R计算R中每月的记录数
【发布时间】:2020-08-11 06:05:42
【问题描述】:

给定商户 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 都会计算“命中”。

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

同一个商家ID在同一个月内交易了多少个唯一卡号?

【问题讨论】:

  • 请将缺少的 ' 添加到您的第一行代码中。 Stack Overflow 不允许我只编辑一个字符。

标签: r dataframe dplyr data-analysis


【解决方案1】:

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

library(dplyr)

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

如果 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)))

【讨论】:

  • 目前还不能投票,因为我的声望低于 15,但这很好用。感谢您的帮助。
【解决方案2】:

您可以使用ave 并计算唯一长度。

df <- transform(df, hits.pm=ave(CardNum, MerchantID, substr(Date, 6, 7), 
                                FUN=function(x) length(unique(x))))
df
#   MerchantID CardNum       Date hits.pm
# 1       1234   1abc1 2020-05-07       1
# 2       1234   1abc1 2020-05-07       1
# 3       1234   2xyz2 2019-10-12       2
# 4       1234   3ijk3 2019-10-25       2
# 5       1235   1abc1 2020-05-07       1
# 6       1236   1abc1 2020-05-07       1
# 7       1235   2xyz2 2019-10-12       2
# 8       1235   3ijk3 2019-10-25       2

数据:

df <- read.table(header=T, text="  MerchantID CardNum       Date
1       1234   1abc1 2020-05-07
2       1234   1abc1 2020-05-07
3       1234   2xyz2 2019-10-12
4       1234   3ijk3 2019-10-25
5       1235   43bc1 2020-05-07
6       1235   foo12 2020-05-07
7       1236   foo34 2019-10-12
8       1236   foo34 2019-10-25
                 ")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多