我正在寻找解决R中的方案的指南,该方案中有一个customer_ID和date_mailed的列表。 customer_ID是每个客户的唯一ID,date_mailed包含向这些客户发送邮件的日期。我正在寻找由customer_ID发送的邮件数量的组计数,其中每个组将是相隔少于90天发送的邮件。示例数据集:
customer_ID 123的2/28和6/1之间的差异为93天,因此将其划分为2个组。这是所需的输出:
需要说明的是,即使Customer_ID 123相同,但第四行123和第三行123之间的间隔超过90天,我希望将前三个123组合在一起,然后将后两个123组合在一起。
答案 0 :(得分:1)
另一个选择:
[('a', 'b'), ('a', 'c'), ('b', 'c')]
[('1', '2'), ('1', '3'), ('1', '4'), ('1', '5'), ('2', '3'), ('2', '4'), ('2', '5'), ('3', '4'), ('3', '5'), ('4', '5')]
输出:
library(dplyr)
df %>%
mutate(Date_Mailed = as.Date(Date_Mailed, "%m/%d/%Y")) %>%
count(
Customer_ID,
grp = cumsum(c(0, +(Date_Mailed > (lag(Date_Mailed) + 90))[-1])),
name = 'Group_Mail_Count'
) %>%
select(-grp)
或使用 Customer_ID Group_Mail_Count
<dbl> <int>
1 123 3
2 123 2
3 456 3
4 890 1
5 890 2
:
data.table
输出:
library(data.table)
setDT(df)[, Date_Mailed := as.Date(Date_Mailed, "%m/%d/%Y")][
, .(Group_Mail_Count = .N), by = .(Customer_ID,
cumsum(c(0, +(Date_Mailed > (lag(Date_Mailed) + 90))[-1])))
][, 'cumsum' := NULL]