簡體   English   中英

統計R中每月的記錄數

[英]Count the number of records per month in 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 合並到我的 dataframe 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
 

預期 Output 數據:

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 都會計算“命中”。

簡單地說,它應該回答這個問題:

同一個商戶號在同一個月內交易了多少個唯一卡號?

您可以從 date 中提取年月值並計算每個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)))

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM